From a73dcca0e7abbf8143b6315e601ab7fe1e774631 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 13:08:15 +0100 Subject: [PATCH 01/16] composer update --- composer.lock | 306 +++- .../cloudflare-plugin-backend/CHANGELOG.md | 44 +- .../cloudflare-plugin-backend/composer.json | 2 +- .../cloudflare-plugin-backend/composer.lock | 264 +++- .../src/API/AbstractAPIClient.php | 84 +- .../src/API/AbstractPluginActions.php | 202 +++ .../src/API/Client.php | 48 +- .../src/API/Exception/CloudFlareException.php | 8 + .../API/Exception/PageRuleLimitException.php | 8 + .../Exception/ZoneSettingFailException.php | 6 + .../src/API/Host.php | 49 +- .../src/API/Plugin.php | 72 + .../src/API/PluginRoutes.php | 35 + .../src/API/Request.php | 1 - .../src/DNSRecord.php | 2 +- .../src/Integration/ConfigInterface.php | 2 +- .../src/Integration/DataStoreInterface.php | 15 +- .../src/Integration/DefaultConfig.php | 3 + .../src/Integration/DefaultIntegration.php | 11 +- .../src/Integration/DefaultLogger.php | 38 +- .../Integration/IntegrationAPIInterface.php | 6 +- .../src/Integration/LoggerInterface.php | 14 - .../src/Router/DefaultRestAPIRouter.php | 43 +- .../src/Router/HostAPIRouter.php | 18 - .../src/Router/RequestRouter.php | 62 + .../src/Router/RouterInterface.php | 1 - .../src/SecurityUtil.php | 26 +- .../src/Test/API/AbstractAPIClientTest.php | 42 + .../Test/API/AbstractPluginActionsTest.php | 91 ++ .../src/Test/API/ClientTest.php | 50 +- .../src/Test/API/HostTest.php | 55 +- .../src/Test/API/PluginTest.php | 65 + .../Test/Integration/DefaultConfigTest.php | 11 +- .../Test/Integration/DefaultLoggerTest.php | 9 +- .../Test/Router/DefaultRestAPIRouterTest.php | 17 +- .../src/Test/Router/HostAPIRouterTest.php | 48 - .../src/Test/Router/RequestRouterTest.php | 63 + .../src/Test/SecurityUtilTest.php | 15 +- vendor/composer/autoload_classmap.php | 2 + vendor/composer/autoload_namespaces.php | 1 - vendor/composer/autoload_psr4.php | 2 + vendor/composer/autoload_real.php | 35 +- vendor/composer/autoload_static.php | 798 ++++++++++ vendor/composer/installed.json | 1084 ++++++++------ vendor/guzzlehttp/guzzle/.editorconfig | 11 - vendor/guzzlehttp/guzzle/.gitignore | 11 - vendor/guzzlehttp/guzzle/CHANGELOG.md | 7 + vendor/guzzlehttp/guzzle/LICENSE | 2 +- vendor/guzzlehttp/guzzle/Makefile | 50 - vendor/guzzlehttp/guzzle/build/packager.php | 21 - vendor/guzzlehttp/guzzle/composer.json | 6 - vendor/guzzlehttp/guzzle/docs/Makefile | 153 -- .../guzzle/docs/_static/guzzle-icon.png | Bin 803 -> 0 bytes .../guzzlehttp/guzzle/docs/_static/logo.png | Bin 247678 -> 0 bytes .../guzzle/docs/_templates/nav_links.html | 3 - vendor/guzzlehttp/guzzle/docs/clients.rst | 1326 ----------------- vendor/guzzlehttp/guzzle/docs/conf.py | 28 - vendor/guzzlehttp/guzzle/docs/events.rst | 516 ------- vendor/guzzlehttp/guzzle/docs/faq.rst | 199 --- vendor/guzzlehttp/guzzle/docs/handlers.rst | 43 - .../guzzlehttp/guzzle/docs/http-messages.rst | 483 ------ vendor/guzzlehttp/guzzle/docs/index.rst | 98 -- vendor/guzzlehttp/guzzle/docs/overview.rst | 150 -- vendor/guzzlehttp/guzzle/docs/quickstart.rst | 448 ------ .../guzzlehttp/guzzle/docs/requirements.txt | 2 - vendor/guzzlehttp/guzzle/docs/streams.rst | 213 --- vendor/guzzlehttp/guzzle/docs/testing.rst | 232 --- vendor/guzzlehttp/guzzle/phpunit.xml.dist | 17 - vendor/guzzlehttp/guzzle/src/Client.php | 9 +- .../guzzlehttp/guzzle/src/ClientInterface.php | 2 +- .../guzzlehttp/guzzle/src/Event/Emitter.php | 3 +- .../guzzle/src/Message/AbstractMessage.php | 2 +- .../guzzle/src/Message/MessageFactory.php | 2 +- .../guzzle/tests/BatchResultsTest.php | 58 - vendor/guzzlehttp/guzzle/tests/ClientTest.php | 647 -------- .../guzzle/tests/CollectionTest.php | 416 ------ .../guzzle/tests/Cookie/CookieJarTest.php | 339 ----- .../guzzle/tests/Cookie/FileCookieJarTest.php | 71 - .../tests/Cookie/SessionCookieJarTest.php | 76 - .../guzzle/tests/Cookie/SetCookieTest.php | 364 ----- .../guzzle/tests/Event/AbstractEventTest.php | 14 - .../tests/Event/AbstractRequestEventTest.php | 33 - .../Event/AbstractRetryableEventTest.php | 37 - .../tests/Event/AbstractTransferEventTest.php | 59 - .../guzzle/tests/Event/BeforeEventTest.php | 26 - .../guzzle/tests/Event/EmitterTest.php | 363 ----- .../guzzle/tests/Event/ErrorEventTest.php | 23 - .../tests/Event/HasEmitterTraitTest.php | 27 - .../tests/Event/ListenerAttacherTraitTest.php | 92 -- .../guzzle/tests/Event/ProgressEventTest.php | 25 - .../guzzle/tests/Event/RequestEventsTest.php | 74 - .../tests/Exception/ParseExceptionTest.php | 20 - .../tests/Exception/RequestExceptionTest.php | 83 -- .../tests/Exception/XmlParseExceptionTest.php | 19 - .../guzzle/tests/IntegrationTest.php | 123 -- .../tests/Message/AbstractMessageTest.php | 269 ---- .../tests/Message/FutureResponseTest.php | 160 -- .../tests/Message/MessageFactoryTest.php | 601 -------- .../tests/Message/MessageParserTest.php | 276 ---- .../guzzle/tests/Message/RequestTest.php | 144 -- .../guzzle/tests/Message/ResponseTest.php | 120 -- .../guzzlehttp/guzzle/tests/MimetypesTest.php | 31 - vendor/guzzlehttp/guzzle/tests/PoolTest.php | 319 ---- .../guzzle/tests/Post/MultipartBodyTest.php | 120 -- .../guzzle/tests/Post/PostBodyTest.php | 255 ---- .../guzzle/tests/Post/PostFileTest.php | 61 - .../guzzle/tests/QueryParserTest.php | 80 - vendor/guzzlehttp/guzzle/tests/QueryTest.php | 171 --- .../guzzle/tests/RequestFsmTest.php | 187 --- .../guzzle/tests/RingBridgeTest.php | 195 --- vendor/guzzlehttp/guzzle/tests/Server.php | 107 -- .../guzzle/tests/Subscriber/CookieTest.php | 74 - .../guzzle/tests/Subscriber/HistoryTest.php | 140 -- .../guzzle/tests/Subscriber/HttpErrorTest.php | 60 - .../guzzle/tests/Subscriber/MockTest.php | 225 --- .../guzzle/tests/Subscriber/PrepareTest.php | 213 --- .../guzzle/tests/Subscriber/RedirectTest.php | 302 ---- .../guzzle/tests/TransactionTest.php | 22 - .../guzzle/tests/UriTemplateTest.php | 202 --- vendor/guzzlehttp/guzzle/tests/UrlTest.php | 364 ----- vendor/guzzlehttp/guzzle/tests/UtilsTest.php | 40 - vendor/guzzlehttp/guzzle/tests/bootstrap.php | 11 - vendor/guzzlehttp/guzzle/tests/perf.php | 61 - .../reflection-common/.gitignore | 4 + .../phpdocumentor/reflection-common/LICENSE | 22 + .../phpdocumentor/reflection-common/README.md | 1 + .../reflection-common/composer.json | 29 + .../reflection-common/composer.lock | 974 ++++++++++++ .../reflection-common/phpunit.xml.dist | 26 + .../reflection-common/src/Element.php | 32 + .../reflection-common/src/File.php | 40 + .../reflection-common/src/Fqsen.php | 78 + .../reflection-common/src/Location.php | 57 + .../reflection-common/src/Project.php | 25 + .../reflection-common/src/ProjectFactory.php | 27 + .../tests/common/bootstrap.php | 10 + .../tests/unit/FqsenTest.php | 88 ++ .../reflection-docblock/.scrutinizer.yml | 32 + .../reflection-docblock/.travis.yml | 32 +- .../reflection-docblock/README.md | 72 +- .../reflection-docblock/composer.json | 28 +- .../reflection-docblock/composer.lock | 671 ++++++--- .../01-interpreting-a-simple-docblock.php | 27 + .../examples/02-interpreting-tags.php | 24 + .../examples/03-reconstituting-a-docblock.php | 27 + .../examples/04-adding-your-own-tag.php | 135 ++ .../playing-with-descriptions/02-escaping.php | 47 + .../reflection-docblock/phpmd.xml.dist | 23 + .../reflection-docblock/phpunit.xml.dist | 25 +- .../reflection-docblock/src/DocBlock.php | 220 +++ .../src/DocBlock/Description.php | 103 ++ .../src/DocBlock/DescriptionFactory.php | 191 +++ .../src/DocBlock/ExampleFinder.php | 170 +++ .../src/DocBlock/Serializer.php | 143 ++ .../src/DocBlock/StandardTagFactory.php | 314 ++++ .../reflection-docblock/src/DocBlock/Tag.php | 26 + .../src/DocBlock/TagFactory.php | 93 ++ .../src/DocBlock/Tags/Author.php | 100 ++ .../src/DocBlock/Tags/BaseTag.php | 52 + .../src/DocBlock/Tags/Covers.php | 84 ++ .../src/DocBlock/Tags/Deprecated.php | 94 ++ .../src/DocBlock/Tags/Example.php | 158 ++ .../DocBlock/Tags/Factory/StaticMethod.php | 18 + .../src/DocBlock/Tags/Factory/Strategy.php | 18 + .../src/DocBlock/Tags/Formatter.php | 27 + .../Tags/Formatter/PassthroughFormatter.php | 31 + .../src/DocBlock/Tags/Generic.php | 91 ++ .../src/DocBlock/Tags/Link.php | 77 + .../src/DocBlock/Tags/Method.php | 220 +++ .../src/DocBlock/Tags/Param.php | 141 ++ .../src/DocBlock/Tags/Property.php | 118 ++ .../src/DocBlock/Tags/PropertyRead.php | 118 ++ .../src/DocBlock/Tags/PropertyWrite.php | 118 ++ .../src/DocBlock/Tags/Return_.php | 73 + .../src/DocBlock/Tags/See.php | 81 + .../src/DocBlock/Tags/Since.php | 94 ++ .../src/DocBlock/Tags/Source.php | 96 ++ .../src/DocBlock/Tags/Throws.php | 72 + .../src/DocBlock/Tags/Uses.php | 83 ++ .../src/DocBlock/Tags/Var_.php | 118 ++ .../src/DocBlock/Tags/Version.php | 94 ++ .../src/DocBlockFactory.php | 277 ++++ .../src/DocBlockFactoryInterface.php | 23 + .../src/phpDocumentor/Reflection/DocBlock.php | 468 ------ .../Reflection/DocBlock/Context.php | 154 -- .../Reflection/DocBlock/Description.php | 223 --- .../Reflection/DocBlock/Location.php | 76 - .../Reflection/DocBlock/Serializer.php | 198 --- .../phpDocumentor/Reflection/DocBlock/Tag.php | 377 ----- .../Reflection/DocBlock/Tag/AuthorTag.php | 131 -- .../Reflection/DocBlock/Tag/CoversTag.php | 24 - .../Reflection/DocBlock/Tag/DeprecatedTag.php | 26 - .../Reflection/DocBlock/Tag/ExampleTag.php | 156 -- .../Reflection/DocBlock/Tag/LinkTag.php | 81 - .../Reflection/DocBlock/Tag/MethodTag.php | 209 --- .../Reflection/DocBlock/Tag/ParamTag.php | 119 -- .../DocBlock/Tag/PropertyReadTag.php | 24 - .../Reflection/DocBlock/Tag/PropertyTag.php | 24 - .../DocBlock/Tag/PropertyWriteTag.php | 24 - .../Reflection/DocBlock/Tag/ReturnTag.php | 99 -- .../Reflection/DocBlock/Tag/SeeTag.php | 81 - .../Reflection/DocBlock/Tag/SinceTag.php | 26 - .../Reflection/DocBlock/Tag/SourceTag.php | 137 -- .../Reflection/DocBlock/Tag/ThrowsTag.php | 24 - .../Reflection/DocBlock/Tag/UsesTag.php | 24 - .../Reflection/DocBlock/Tag/VarTag.php | 24 - .../Reflection/DocBlock/Tag/VersionTag.php | 108 -- .../Reflection/DocBlock/Type/Collection.php | 221 --- .../integration/InterpretingDocBlocksTest.php | 97 ++ .../ReconstitutingADocBlockTest.php | 35 + .../tests/integration/UsingTagsTest.php | 39 + .../Reflection/DocBlock/DescriptionTest.php | 245 --- .../Reflection/DocBlock/Tag/CoversTagTest.php | 86 -- .../DocBlock/Tag/DeprecatedTagTest.php | 115 -- .../DocBlock/Tag/ExampleTagTest.php | 203 --- .../Reflection/DocBlock/Tag/LinkTagTest.php | 87 -- .../Reflection/DocBlock/Tag/MethodTagTest.php | 146 -- .../Reflection/DocBlock/Tag/ParamTagTest.php | 118 -- .../Reflection/DocBlock/Tag/ReturnTagTest.php | 102 -- .../Reflection/DocBlock/Tag/SeeTagTest.php | 86 -- .../Reflection/DocBlock/Tag/SinceTagTest.php | 115 -- .../Reflection/DocBlock/Tag/SourceTagTest.php | 116 -- .../Reflection/DocBlock/Tag/ThrowsTagTest.php | 102 -- .../Reflection/DocBlock/Tag/UsesTagTest.php | 86 -- .../Reflection/DocBlock/Tag/VarTagTest.php | 94 -- .../DocBlock/Tag/VersionTagTest.php | 115 -- .../Reflection/DocBlock/TagTest.php | 313 ---- .../DocBlock/Type/CollectionTest.php | 195 --- .../phpDocumentor/Reflection/DocBlockTest.php | 337 ----- .../unit/DocBlock/DescriptionFactoryTest.php | 174 +++ .../tests/unit/DocBlock/DescriptionTest.php | 75 + .../tests/unit/DocBlock/SerializerTest.php | 201 +++ .../unit/DocBlock/StandardTagFactoryTest.php | 361 +++++ .../tests/unit/DocBlock/Tags/AuthorTest.php | 148 ++ .../tests/unit/DocBlock/Tags/CoversTest.php | 155 ++ .../unit/DocBlock/Tags/DeprecatedTest.php | 166 +++ .../Formatter/PassthroughFormatterTest.php | 41 + .../tests/unit/DocBlock/Tags/GenericTest.php | 146 ++ .../tests/unit/DocBlock/Tags/LinkTest.php | 158 ++ .../tests/unit/DocBlock/Tags/MethodTest.php | 410 +++++ .../tests/unit/DocBlock/Tags/ParamTest.php | 228 +++ .../unit/DocBlock/Tags/PropertyReadTest.php | 201 +++ .../tests/unit/DocBlock/Tags/PropertyTest.php | 200 +++ .../unit/DocBlock/Tags/PropertyWriteTest.php | 201 +++ .../tests/unit/DocBlock/Tags/ReturnTest.php | 170 +++ .../tests/unit/DocBlock/Tags/SeeTest.php | 173 +++ .../tests/unit/DocBlock/Tags/SinceTest.php | 166 +++ .../tests/unit/DocBlock/Tags/SourceTest.php | 199 +++ .../tests/unit/DocBlock/Tags/ThrowsTest.php | 170 +++ .../tests/unit/DocBlock/Tags/UsesTest.php | 174 +++ .../tests/unit/DocBlock/Tags/VarTest.php | 200 +++ .../tests/unit/DocBlock/Tags/VersionTest.php | 166 +++ .../tests/unit/DocBlockFactoryTest.php | 290 ++++ .../tests/unit/DocBlockTest.php | 252 ++++ vendor/phpdocumentor/type-resolver/.gitignore | 3 + .../type-resolver/.scrutinizer.yml | 31 + .../phpdocumentor/type-resolver/.travis.yml | 34 + vendor/phpdocumentor/type-resolver/LICENSE | 21 + vendor/phpdocumentor/type-resolver/README.md | 169 +++ .../phpdocumentor/type-resolver/composer.json | 27 + .../examples/01-resolving-simple-types.php | 13 + .../examples/02-resolving-classes.php | 12 + .../examples/03-resolving-all-elements.php | 17 + ...ing-the-context-using-class-reflection.php | 30 + ...ng-the-context-using-method-reflection.php | 30 + ...vering-the-context-using-file-contents.php | 22 + .../type-resolver/examples/Classy.php | 16 + .../type-resolver/phpmd.xml.dist | 23 + .../type-resolver/phpunit.xml.dist | 31 + .../type-resolver/src/FqsenResolver.php | 76 + .../phpdocumentor/type-resolver/src/Type.php | 18 + .../type-resolver/src/TypeResolver.php | 266 ++++ .../type-resolver/src/Types/Array_.php | 87 ++ .../type-resolver/src/Types/Boolean.php | 31 + .../type-resolver/src/Types/Callable_.php | 31 + .../type-resolver/src/Types/Compound.php | 82 + .../type-resolver/src/Types/Context.php | 84 ++ .../src/Types/ContextFactory.php | 210 +++ .../type-resolver/src/Types/Float_.php | 31 + .../type-resolver/src/Types/Integer.php | 28 + .../type-resolver/src/Types/Mixed.php | 31 + .../type-resolver/src/Types/Null_.php | 31 + .../type-resolver/src/Types/Object_.php | 70 + .../type-resolver/src/Types/Resource.php | 31 + .../type-resolver/src/Types/Scalar.php | 31 + .../type-resolver/src/Types/Self_.php | 33 + .../type-resolver/src/Types/Static_.php | 38 + .../type-resolver/src/Types/String_.php | 31 + .../type-resolver/src/Types/This.php | 34 + .../type-resolver/src/Types/Void_.php | 34 + .../tests/unit/TypeResolverTest.php | 395 +++++ .../tests/unit/Types/ContextFactoryTest.php | 188 +++ .../tests/unit/Types/ContextTest.php | 61 + vendor/phpspec/prophecy/.gitignore | 4 +- vendor/phpspec/prophecy/.travis.yml | 14 +- vendor/phpspec/prophecy/CHANGES.md | 7 + vendor/phpspec/prophecy/composer.json | 11 +- vendor/phpspec/prophecy/composer.lock | 720 --------- .../Doubler/ClassPatch/MagicCallPatchSpec.php | 21 + .../ClassPatch/SplFileInfoPatchSpec.php | 16 + .../Doubler/ClassPatch/MagicCallPatch.php | 28 +- .../Doubler/ClassPatch/SplFileInfoPatch.php | 20 + .../Doubler/MethodNotExtendableException.php | 6 - .../ClassAndInterfaceTagRetriever.php | 69 + .../PhpDocumentor/ClassTagRetriever.php | 52 + .../PhpDocumentor/LegacyClassTagRetriever.php | 35 + .../MethodTagRetrieverInterface.php | 30 + .../src/Prophecy/Prophecy/MethodProphecy.php | 1 + vendor/phpunit/php-timer/.gitignore | 10 +- vendor/phpunit/php-timer/.travis.yml | 10 +- vendor/phpunit/php-timer/README.md | 2 +- vendor/phpunit/php-timer/composer.json | 4 + vendor/phpunit/php-timer/src/Timer.php | 2 +- vendor/phpunit/php-timer/tests/TimerTest.php | 2 +- vendor/phpunit/phpunit/.gitattributes | 1 + vendor/phpunit/phpunit/.gitignore | 36 +- vendor/phpunit/phpunit/.travis.yml | 4 +- vendor/phpunit/phpunit/CONTRIBUTING.md | 2 +- vendor/phpunit/phpunit/ChangeLog-4.8.md | 22 + vendor/phpunit/phpunit/build.xml | 327 ++-- vendor/phpunit/phpunit/build/bin/phpab | 891 ----------- .../phpunit/build/binary-phar-autoload.php.in | 34 - vendor/phpunit/phpunit/build/ca.pem | 25 - .../build/library-phar-autoload.php.in | 9 - .../phpunit/phpunit/build/phar-manifest.php | 27 - vendor/phpunit/phpunit/build/phar-version.php | 22 - .../phpunit/phpunit/build/travis-ci-fail.xml | 16 - vendor/phpunit/phpunit/composer.json | 5 +- vendor/phpunit/phpunit/phpdox.xml.dist | 23 - .../phpunit/{phpunit.xml.dist => phpunit.xml} | 0 vendor/phpunit/phpunit/phpunit.xsd | 26 +- .../Constraint/TraversableContains.php | 4 +- .../phpunit/src/Framework/TestCase.php | 6 +- vendor/phpunit/phpunit/src/Runner/Version.php | 19 +- .../phpunit/phpunit/src/TextUI/TestRunner.php | 2 +- .../Util/PHP/Template/TestCaseMethod.tpl.dist | 9 + vendor/phpunit/phpunit/src/Util/Printer.php | 2 +- vendor/phpunit/phpunit/src/Util/Test.php | 16 +- .../phpunit/tests/Regression/GitHub/1149.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1216.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1265.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1330.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1335.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1337.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1348.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1351.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1374.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1437.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1468.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1471.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1472.phpt | 2 +- .../phpunit/tests/Regression/GitHub/1570.phpt | 2 +- .../phpunit/tests/Regression/GitHub/2158.phpt | 19 + .../Regression/GitHub/2158/Issue2158Test.php | 23 + .../tests/Regression/GitHub/2158/constant.inc | 5 + .../phpunit/tests/Regression/GitHub/244.phpt | 2 +- .../phpunit/tests/Regression/GitHub/322.phpt | 2 +- .../phpunit/tests/Regression/GitHub/433.phpt | 2 +- .../phpunit/tests/Regression/GitHub/445.phpt | 2 +- .../phpunit/tests/Regression/GitHub/498.phpt | 2 +- .../phpunit/tests/Regression/GitHub/503.phpt | 2 +- .../phpunit/tests/Regression/GitHub/581.phpt | 2 +- .../phpunit/tests/Regression/GitHub/74.phpt | 2 +- .../phpunit/tests/Regression/GitHub/765.phpt | 2 +- .../phpunit/tests/Regression/GitHub/797.phpt | 2 +- .../phpunit/tests/Regression/GitHub/863.phpt | 2 +- .../phpunit/tests/Regression/Trac/1021.phpt | 2 +- .../phpunit/tests/Regression/Trac/523.phpt | 2 +- .../phpunit/tests/Regression/Trac/578.phpt | 2 +- .../phpunit/tests/Regression/Trac/684.phpt | 2 +- .../phpunit/tests/Regression/Trac/783.phpt | 2 +- .../tests/TextUI/abstract-test-class.phpt | 2 +- .../phpunit/tests/TextUI/colors-always.phpt | 2 +- .../tests/TextUI/concrete-test-class.phpt | 2 +- .../tests/TextUI/custom-printer-debug.phpt | 2 +- .../tests/TextUI/custom-printer-verbose.phpt | 2 +- .../tests/TextUI/dataprovider-debug.phpt | 2 +- .../dataprovider-log-xml-isolation.phpt | 2 +- .../tests/TextUI/dataprovider-log-xml.phpt | 2 +- .../phpunit/phpunit/tests/TextUI/debug.phpt | 2 +- .../tests/TextUI/default-isolation.phpt | 2 +- .../phpunit/phpunit/tests/TextUI/default.phpt | 2 +- .../tests/TextUI/dependencies-isolation.phpt | 2 +- .../phpunit/tests/TextUI/dependencies.phpt | 2 +- .../tests/TextUI/dependencies2-isolation.phpt | 2 +- .../phpunit/tests/TextUI/dependencies2.phpt | 2 +- .../tests/TextUI/dependencies3-isolation.phpt | 2 +- .../phpunit/tests/TextUI/dependencies3.phpt | 2 +- .../phpunit/tests/TextUI/empty-testcase.phpt | 2 +- .../phpunit/tests/TextUI/exception-stack.phpt | 2 +- .../tests/TextUI/exclude-group-isolation.phpt | 2 +- .../phpunit/tests/TextUI/exclude-group.phpt | 2 +- .../tests/TextUI/failure-isolation.phpt | 2 +- .../phpunit/phpunit/tests/TextUI/failure.phpt | 2 +- .../phpunit/tests/TextUI/fatal-isolation.phpt | 2 +- .../tests/TextUI/filter-class-isolation.phpt | 2 +- .../phpunit/tests/TextUI/filter-class.phpt | 2 +- ...ider-by-classname-and-range-isolation.phpt | 2 +- ...r-dataprovider-by-classname-and-range.phpt | 2 +- ...lter-dataprovider-by-number-isolation.phpt | 2 +- .../TextUI/filter-dataprovider-by-number.phpt | 2 +- ...-dataprovider-by-only-range-isolation.phpt | 2 +- .../filter-dataprovider-by-only-range.phpt | 2 +- ...dataprovider-by-only-regexp-isolation.phpt | 2 +- .../filter-dataprovider-by-only-regexp.phpt | 2 +- ...dataprovider-by-only-string-isolation.phpt | 2 +- .../filter-dataprovider-by-only-string.phpt | 2 +- ...ilter-dataprovider-by-range-isolation.phpt | 2 +- .../TextUI/filter-dataprovider-by-range.phpt | 2 +- ...lter-dataprovider-by-regexp-isolation.phpt | 2 +- .../TextUI/filter-dataprovider-by-regexp.phpt | 2 +- ...lter-dataprovider-by-string-isolation.phpt | 2 +- .../TextUI/filter-dataprovider-by-string.phpt | 2 +- .../filter-method-case-insensitive.phpt | 2 +- ...ilter-method-case-sensitive-no-result.phpt | 2 +- .../tests/TextUI/filter-method-isolation.phpt | 2 +- .../phpunit/tests/TextUI/filter-method.phpt | 2 +- .../tests/TextUI/filter-no-results.phpt | 2 +- .../phpunit/tests/TextUI/group-isolation.phpt | 2 +- .../phpunit/phpunit/tests/TextUI/group.phpt | 2 +- .../phpunit/tests/TextUI/ini-isolation.phpt | 2 +- .../TextUI/log-json-no-pretty-print.phpt | 2 +- .../tests/TextUI/log-json-post-66021.phpt | 2 +- .../tests/TextUI/log-json-pre-66021.phpt | 2 +- .../phpunit/phpunit/tests/TextUI/log-tap.phpt | 2 +- .../phpunit/phpunit/tests/TextUI/log-xml.phpt | 2 +- .../tests/TextUI/options-after-arguments.phpt | 2 +- .../tests/TextUI/output-isolation.phpt | 2 +- .../phpunit/phpunit/tests/TextUI/repeat.phpt | 2 +- .../report-useless-tests-incomplete.phpt | 2 +- .../report-useless-tests-isolation.phpt | 2 +- .../tests/TextUI/report-useless-tests.phpt | 2 +- .../tests/TextUI/test-suffix-multiple.phpt | 2 +- .../tests/TextUI/test-suffix-single.phpt | 2 +- .../phpunit/tests/TextUI/testdox-html.phpt | 2 +- .../phpunit/tests/TextUI/testdox-text.phpt | 2 +- .../phpunit/phpunit/tests/Util/TestTest.php | 14 +- vendor/react/promise/.gitignore | 1 + vendor/react/promise/.travis.yml | 9 +- vendor/react/promise/CHANGELOG.md | 98 +- vendor/react/promise/README.md | 35 +- vendor/react/promise/composer.json | 5 + vendor/react/promise/phpunit.xml.dist | 3 + .../react/promise/src/CancellationQueue.php | 55 + .../promise/src/Exception/LengthException.php | 7 + vendor/react/promise/src/FulfilledPromise.php | 2 + vendor/react/promise/src/LazyPromise.php | 2 + vendor/react/promise/src/Promise.php | 4 + vendor/react/promise/src/RejectedPromise.php | 2 + .../src/UnhandledRejectionException.php | 2 +- vendor/react/promise/src/functions.php | 179 ++- .../promise/tests/CancellationQueueTest.php | 98 ++ .../react/promise/tests/FunctionAnyTest.php | 84 +- .../react/promise/tests/FunctionMapTest.php | 48 + .../react/promise/tests/FunctionRaceTest.php | 79 + .../promise/tests/FunctionReduceTest.php | 51 + .../promise/tests/FunctionResolveTest.php | 67 + .../react/promise/tests/FunctionSomeTest.php | 126 +- vendor/react/promise/tests/PromiseTest.php | 32 - .../PromiseTest/PromiseRejectedTestTrait.php | 20 + .../fixtures/SimpleFulfilledTestPromise.php | 21 + .../fixtures/SimpleFulfilledTestThenable.php | 21 + .../fixtures/SimpleRejectedTestPromise.php | 21 + .../tests/fixtures/SimpleTestCancellable.php | 13 + .../SimpleTestCancellableThenable.php | 18 + vendor/sebastian/environment/src/Console.php | 4 +- vendor/sebastian/environment/src/Runtime.php | 2 +- vendor/sebastian/exporter/composer.json | 5 +- vendor/sebastian/exporter/src/Exporter.php | 19 +- .../sebastian/exporter/tests/ExporterTest.php | 25 + vendor/squizlabs/php_codesniffer/.gitignore | 1 + .../squizlabs/php_codesniffer/CodeSniffer.php | 81 +- .../php_codesniffer/CodeSniffer/CLI.php | 128 +- .../php_codesniffer/CodeSniffer/File.php | 123 +- .../php_codesniffer/CodeSniffer/Fixer.php | 35 + .../CodeSniffer/Reports/VersionControl.php | 64 +- .../InlineControlStructureSniff.php | 176 ++- .../Generic/Sniffs/Files/LineLengthSniff.php | 24 + .../MultipleStatementAlignmentSniff.php | 14 +- .../Sniffs/Formatting/SpaceAfterNotSniff.php | 90 ++ .../CallTimePassByReferenceSniff.php | 19 +- ...ningFunctionBraceKernighanRitchieSniff.php | 3 +- .../Generic/Sniffs/PHP/SyntaxSniff.php | 7 +- .../WhiteSpace/DisallowSpaceIndentSniff.php | 1 + .../WhiteSpace/DisallowTabIndentSniff.php | 1 + .../Sniffs/WhiteSpace/ScopeIndentSniff.php | 252 +++- .../Sniffs/Commenting/ClassCommentSniff.php | 22 +- .../Sniffs/Commenting/FileCommentSniff.php | 42 +- .../MultiLineConditionSniff.php | 14 +- .../Functions/FunctionCallSignatureSniff.php | 136 +- .../Functions/FunctionDeclarationSniff.php | 62 +- .../PSR1/Sniffs/Files/SideEffectsSniff.php | 11 + .../Sniffs/Classes/ClassDeclarationSniff.php | 4 +- .../Methods/FunctionClosingBraceSniff.php | 104 ++ .../CodeSniffer/Standards/PSR2/ruleset.xml | 19 + .../Arrays/ArrayBracketSpacingSniff.php | 4 + .../Sniffs/Arrays/ArrayDeclarationSniff.php | 10 +- .../CSS/ClassDefinitionNameSpacingSniff.php | 4 +- .../ClassDefinitionOpeningBraceSpaceSniff.php | 10 +- .../Squiz/Sniffs/CSS/IndentationSniff.php | 5 +- .../Squiz/Sniffs/CSS/OpacitySniff.php | 2 +- .../Sniffs/Commenting/BlockCommentSniff.php | 58 +- .../Sniffs/Commenting/ClassCommentSniff.php | 26 +- .../Sniffs/Commenting/FileCommentSniff.php | 37 + .../Commenting/FunctionCommentSniff.php | 9 +- .../FunctionCommentThrowTagSniff.php | 33 +- .../Sniffs/Commenting/InlineCommentSniff.php | 4 + .../InlineIfDeclarationSniff.php | 4 +- ...unctionDeclarationArgumentSpacingSniff.php | 110 +- .../MultiLineFunctionDeclarationSniff.php | 67 + .../ComparisonOperatorUsageSniff.php | 53 +- .../Squiz/Sniffs/PHP/InnerFunctionsSniff.php | 26 +- .../Sniffs/PHP/LowercasePHPFunctionsSniff.php | 26 +- .../Sniffs/PHP/NonExecutableCodeSniff.php | 8 +- .../WhiteSpace/MemberVarSpacingSniff.php | 6 + .../WhiteSpace/OperatorSpacingSniff.php | 2 +- .../CodeSniffer/Tokenizers/CSS.php | 7 + .../CodeSniffer/Tokenizers/Comment.php | 1 - .../CodeSniffer/Tokenizers/JS.php | 17 +- .../CodeSniffer/Tokenizers/PHP.php | 118 +- .../php_codesniffer/CodeSniffer/Tokens.php | 63 +- vendor/squizlabs/php_codesniffer/README.md | 4 +- .../squizlabs/php_codesniffer/composer.json | 3 +- .../squizlabs/php_codesniffer/phpcs.xml.dist | 1 - vendor/symfony/yaml/Dumper.php | 8 +- vendor/symfony/yaml/Escaper.php | 4 +- vendor/symfony/yaml/Inline.php | 30 +- vendor/symfony/yaml/Parser.php | 99 +- vendor/symfony/yaml/README.md | 20 +- vendor/symfony/yaml/Tests/DumperTest.php | 18 + vendor/symfony/yaml/Tests/InlineTest.php | 20 + vendor/symfony/yaml/Tests/ParserTest.php | 141 +- vendor/symfony/yaml/Tests/YamlTest.php | 18 + vendor/symfony/yaml/Unescaper.php | 8 +- vendor/symfony/yaml/Yaml.php | 16 +- vendor/webmozart/assert/.composer-auth.json | 7 + vendor/webmozart/assert/.gitignore | 2 + vendor/webmozart/assert/.styleci.yml | 7 + vendor/webmozart/assert/.travis.yml | 35 + vendor/webmozart/assert/CHANGELOG.md | 28 + vendor/webmozart/assert/LICENSE | 20 + vendor/webmozart/assert/README.md | 235 +++ vendor/webmozart/assert/appveyor.yml | 36 + vendor/webmozart/assert/composer.json | 34 + vendor/webmozart/assert/phpunit.xml.dist | 16 + vendor/webmozart/assert/src/Assert.php | 903 +++++++++++ vendor/webmozart/assert/tests/AssertTest.php | 422 ++++++ 547 files changed, 21776 insertions(+), 21535 deletions(-) create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractPluginActions.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/API/Exception/CloudFlareException.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/API/Exception/PageRuleLimitException.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/API/Exception/ZoneSettingFailException.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/API/Plugin.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/API/PluginRoutes.php delete mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Integration/LoggerInterface.php delete mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Router/HostAPIRouter.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Router/RequestRouter.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractAPIClientTest.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractPluginActionsTest.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/PluginTest.php delete mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/HostAPIRouterTest.php create mode 100644 vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/RequestRouterTest.php create mode 100644 vendor/composer/autoload_static.php delete mode 100644 vendor/guzzlehttp/guzzle/.editorconfig delete mode 100644 vendor/guzzlehttp/guzzle/.gitignore delete mode 100644 vendor/guzzlehttp/guzzle/Makefile delete mode 100644 vendor/guzzlehttp/guzzle/build/packager.php delete mode 100644 vendor/guzzlehttp/guzzle/docs/Makefile delete mode 100644 vendor/guzzlehttp/guzzle/docs/_static/guzzle-icon.png delete mode 100644 vendor/guzzlehttp/guzzle/docs/_static/logo.png delete mode 100644 vendor/guzzlehttp/guzzle/docs/_templates/nav_links.html delete mode 100644 vendor/guzzlehttp/guzzle/docs/clients.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/conf.py delete mode 100644 vendor/guzzlehttp/guzzle/docs/events.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/faq.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/handlers.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/http-messages.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/index.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/overview.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/quickstart.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/requirements.txt delete mode 100644 vendor/guzzlehttp/guzzle/docs/streams.rst delete mode 100644 vendor/guzzlehttp/guzzle/docs/testing.rst delete mode 100644 vendor/guzzlehttp/guzzle/phpunit.xml.dist delete mode 100644 vendor/guzzlehttp/guzzle/tests/BatchResultsTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/ClientTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/CollectionTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Cookie/CookieJarTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Cookie/FileCookieJarTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Cookie/SessionCookieJarTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Cookie/SetCookieTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/AbstractEventTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/AbstractRequestEventTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/AbstractRetryableEventTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/AbstractTransferEventTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/BeforeEventTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/EmitterTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/ErrorEventTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/HasEmitterTraitTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/ListenerAttacherTraitTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/ProgressEventTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Event/RequestEventsTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Exception/ParseExceptionTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Exception/RequestExceptionTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Exception/XmlParseExceptionTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/IntegrationTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Message/AbstractMessageTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Message/FutureResponseTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Message/MessageFactoryTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Message/MessageParserTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Message/RequestTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Message/ResponseTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/MimetypesTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/PoolTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Post/MultipartBodyTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Post/PostBodyTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Post/PostFileTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/QueryParserTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/QueryTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/RequestFsmTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/RingBridgeTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Server.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Subscriber/CookieTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Subscriber/HistoryTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Subscriber/HttpErrorTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Subscriber/MockTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Subscriber/PrepareTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/Subscriber/RedirectTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/TransactionTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/UriTemplateTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/UrlTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/UtilsTest.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/bootstrap.php delete mode 100644 vendor/guzzlehttp/guzzle/tests/perf.php create mode 100644 vendor/phpdocumentor/reflection-common/.gitignore create mode 100644 vendor/phpdocumentor/reflection-common/LICENSE create mode 100644 vendor/phpdocumentor/reflection-common/README.md create mode 100644 vendor/phpdocumentor/reflection-common/composer.json create mode 100644 vendor/phpdocumentor/reflection-common/composer.lock create mode 100644 vendor/phpdocumentor/reflection-common/phpunit.xml.dist create mode 100644 vendor/phpdocumentor/reflection-common/src/Element.php create mode 100644 vendor/phpdocumentor/reflection-common/src/File.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Fqsen.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Location.php create mode 100644 vendor/phpdocumentor/reflection-common/src/Project.php create mode 100644 vendor/phpdocumentor/reflection-common/src/ProjectFactory.php create mode 100644 vendor/phpdocumentor/reflection-common/tests/common/bootstrap.php create mode 100644 vendor/phpdocumentor/reflection-common/tests/unit/FqsenTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml create mode 100644 vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php create mode 100644 vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php create mode 100644 vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php create mode 100644 vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php create mode 100644 vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php create mode 100644 vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/integration/InterpretingDocBlocksTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php delete mode 100644 vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php create mode 100644 vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php create mode 100644 vendor/phpdocumentor/type-resolver/.gitignore create mode 100644 vendor/phpdocumentor/type-resolver/.scrutinizer.yml create mode 100644 vendor/phpdocumentor/type-resolver/.travis.yml create mode 100644 vendor/phpdocumentor/type-resolver/LICENSE create mode 100644 vendor/phpdocumentor/type-resolver/README.md create mode 100644 vendor/phpdocumentor/type-resolver/composer.json create mode 100644 vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php create mode 100644 vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php create mode 100644 vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php create mode 100644 vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php create mode 100644 vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php create mode 100644 vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php create mode 100644 vendor/phpdocumentor/type-resolver/examples/Classy.php create mode 100644 vendor/phpdocumentor/type-resolver/phpmd.xml.dist create mode 100644 vendor/phpdocumentor/type-resolver/phpunit.xml.dist create mode 100644 vendor/phpdocumentor/type-resolver/src/FqsenResolver.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Type.php create mode 100644 vendor/phpdocumentor/type-resolver/src/TypeResolver.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Array_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Boolean.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Callable_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Compound.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Context.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Float_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Integer.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Mixed.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Null_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Object_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Resource.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Scalar.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Self_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Static_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/String_.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/This.php create mode 100644 vendor/phpdocumentor/type-resolver/src/Types/Void_.php create mode 100644 vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php create mode 100644 vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php create mode 100644 vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php delete mode 100644 vendor/phpspec/prophecy/composer.lock create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php create mode 100644 vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php delete mode 100755 vendor/phpunit/phpunit/build/bin/phpab delete mode 100644 vendor/phpunit/phpunit/build/binary-phar-autoload.php.in delete mode 100644 vendor/phpunit/phpunit/build/ca.pem delete mode 100644 vendor/phpunit/phpunit/build/library-phar-autoload.php.in delete mode 100755 vendor/phpunit/phpunit/build/phar-manifest.php delete mode 100755 vendor/phpunit/phpunit/build/phar-version.php delete mode 100644 vendor/phpunit/phpunit/build/travis-ci-fail.xml delete mode 100644 vendor/phpunit/phpunit/phpdox.xml.dist rename vendor/phpunit/phpunit/{phpunit.xml.dist => phpunit.xml} (100%) create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/2158.phpt create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/2158/Issue2158Test.php create mode 100644 vendor/phpunit/phpunit/tests/Regression/GitHub/2158/constant.inc create mode 100644 vendor/react/promise/src/CancellationQueue.php create mode 100644 vendor/react/promise/src/Exception/LengthException.php create mode 100644 vendor/react/promise/tests/CancellationQueueTest.php create mode 100644 vendor/react/promise/tests/fixtures/SimpleFulfilledTestPromise.php create mode 100644 vendor/react/promise/tests/fixtures/SimpleFulfilledTestThenable.php create mode 100644 vendor/react/promise/tests/fixtures/SimpleRejectedTestPromise.php create mode 100644 vendor/react/promise/tests/fixtures/SimpleTestCancellable.php create mode 100644 vendor/react/promise/tests/fixtures/SimpleTestCancellableThenable.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php create mode 100644 vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php create mode 100644 vendor/webmozart/assert/.composer-auth.json create mode 100644 vendor/webmozart/assert/.gitignore create mode 100644 vendor/webmozart/assert/.styleci.yml create mode 100644 vendor/webmozart/assert/.travis.yml create mode 100644 vendor/webmozart/assert/CHANGELOG.md create mode 100644 vendor/webmozart/assert/LICENSE create mode 100644 vendor/webmozart/assert/README.md create mode 100644 vendor/webmozart/assert/appveyor.yml create mode 100644 vendor/webmozart/assert/composer.json create mode 100644 vendor/webmozart/assert/phpunit.xml.dist create mode 100644 vendor/webmozart/assert/src/Assert.php create mode 100644 vendor/webmozart/assert/tests/AssertTest.php diff --git a/composer.lock b/composer.lock index 95c77878..e13fedda 100644 --- a/composer.lock +++ b/composer.lock @@ -4,21 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "99fd7c0cda20486082c862f684c32c8a", - "content-hash": "9d9371769ea2cf3919d6e7902cfb2ef9", + "hash": "768e612e789febd7c8318f992cdd9160", + "content-hash": "3e398783a3a4470e245145163cde4a3d", "packages": [ { "name": "cloudflare/cloudflare-plugin-backend", - "version": "1.0.1", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/cloudflare/cloudflare-plugin-backend.git", - "reference": "b5a1ab53627181318766fdc66ccb6dbfb4d1b965" + "reference": "1c81bb1f86650d8e0a121a14633fa8a94ef1496c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cloudflare/cloudflare-plugin-backend/zipball/b5a1ab53627181318766fdc66ccb6dbfb4d1b965", - "reference": "b5a1ab53627181318766fdc66ccb6dbfb4d1b965", + "url": "https://api.github.com/repos/cloudflare/cloudflare-plugin-backend/zipball/1c81bb1f86650d8e0a121a14633fa8a94ef1496c", + "reference": "1c81bb1f86650d8e0a121a14633fa8a94ef1496c", "shasum": "" }, "require": { @@ -40,20 +40,20 @@ "BSD-3-Clause" ], "description": "A PHP backend for CloudFlare plugins.", - "time": "2016-06-07 20:33:13" + "time": "2016-08-11 23:24:15" }, { "name": "guzzlehttp/guzzle", - "version": "5.3.0", + "version": "5.3.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f3c8c22471cb55475105c14769644a49c3262b93" + "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f3c8c22471cb55475105c14769644a49c3262b93", - "reference": "f3c8c22471cb55475105c14769644a49c3262b93", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/70f1fa53b71c4647bf2762c09068a95f77e12fb8", + "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8", "shasum": "" }, "require": { @@ -62,15 +62,9 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0", - "psr/log": "^1.0" + "phpunit/phpunit": "^4.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "GuzzleHttp\\": "src/" @@ -98,7 +92,7 @@ "rest", "web service" ], - "time": "2015-05-20 03:47:55" + "time": "2016-07-15 19:28:39" }, { "name": "guzzlehttp/ringphp", @@ -241,16 +235,16 @@ }, { "name": "react/promise", - "version": "v2.2.2", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "3aacad8bf10c7d83e6fa2089d413529888c2bedf" + "reference": "8025426794f1944de806618671d4fa476dc7626f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/3aacad8bf10c7d83e6fa2089d413529888c2bedf", - "reference": "3aacad8bf10c7d83e6fa2089d413529888c2bedf", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8025426794f1944de806618671d4fa476dc7626f", + "reference": "8025426794f1944de806618671d4fa476dc7626f", "shasum": "" }, "require": { @@ -281,20 +275,20 @@ } ], "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "time": "2016-02-26 19:09:02" + "time": "2016-05-03 17:50:52" }, { "name": "symfony/yaml", - "version": "v2.8.3", + "version": "v2.8.9", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "2a4ee40acb880c56f29fb1b8886e7ffe94f3b995" + "reference": "0ceab136f43ed9d3e97b3eea32a7855dc50c121d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/2a4ee40acb880c56f29fb1b8886e7ffe94f3b995", - "reference": "2a4ee40acb880c56f29fb1b8886e7ffe94f3b995", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0ceab136f43ed9d3e97b3eea32a7855dc50c121d", + "reference": "0ceab136f43ed9d3e97b3eea32a7855dc50c121d", "shasum": "" }, "require": { @@ -330,7 +324,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2016-02-23 07:41:20" + "time": "2016-07-17 09:06:15" } ], "packages-dev": [ @@ -388,39 +382,136 @@ ], "time": "2015-06-14 21:17:01" }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2015-12-27 11:43:31" + }, { "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2016-06-10 09:48:41" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "psr-0": { - "phpDocumentor": [ + "psr-4": { + "phpDocumentor\\Reflection\\": [ "src/" ] } @@ -432,39 +523,39 @@ "authors": [ { "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "email": "me@mikevanriel.com" } ], - "time": "2015-02-03 12:10:50" + "time": "2016-06-10 07:14:17" }, { "name": "phpspec/prophecy", - "version": "v1.6.0", + "version": "v1.6.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" + "reference": "58a8137754bc24b25740d4281399a4a3596058e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", + "reference": "58a8137754bc24b25740d4281399a4a3596058e0", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1", - "sebastian/recursion-context": "~1.0" + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1", + "sebastian/recursion-context": "^1.0" }, "require-dev": { - "phpspec/phpspec": "~2.0" + "phpspec/phpspec": "^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -497,7 +588,7 @@ "spy", "stub" ], - "time": "2016-02-15 07:46:21" + "time": "2016-06-07 08:13:47" }, { "name": "phpunit/php-code-coverage", @@ -651,21 +742,24 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.7", + "version": "1.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "phpunit/phpunit": "~4|~5" + }, "type": "library", "autoload": { "classmap": [ @@ -688,7 +782,7 @@ "keywords": [ "timer" ], - "time": "2015-06-21 08:01:12" + "time": "2016-05-12 18:03:57" }, { "name": "phpunit/php-token-stream", @@ -741,16 +835,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.24", + "version": "4.8.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a1066c562c52900a142a0e2bbf0582994671385e" + "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e", - "reference": "a1066c562c52900a142a0e2bbf0582994671385e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c062dddcb68e44b563f66ee319ddae2b5a322a90", + "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90", "shasum": "" }, "require": { @@ -764,7 +858,7 @@ "phpunit/php-code-coverage": "~2.1", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", + "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "~2.3", "sebastian/comparator": "~1.1", "sebastian/diff": "~1.2", @@ -809,7 +903,7 @@ "testing", "xunit" ], - "time": "2016-03-14 06:16:08" + "time": "2016-07-21 06:48:14" }, { "name": "phpunit/phpunit-mock-objects", @@ -985,16 +1079,16 @@ }, { "name": "sebastian/environment", - "version": "1.3.5", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", "shasum": "" }, "require": { @@ -1031,20 +1125,20 @@ "environment", "hhvm" ], - "time": "2016-02-26 18:40:46" + "time": "2016-05-17 03:18:57" }, { "name": "sebastian/exporter", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", "shasum": "" }, "require": { @@ -1052,12 +1146,13 @@ "sebastian/recursion-context": "~1.0" }, "require-dev": { + "ext-mbstring": "*", "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -1097,7 +1192,7 @@ "export", "exporter" ], - "time": "2015-06-21 07:55:53" + "time": "2016-06-17 09:04:28" }, { "name": "sebastian/global-state", @@ -1240,19 +1335,20 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "2.5.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8" + "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6731851d6aaf1d0d6c58feff1065227b7fda3ba8", - "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4edb770cb853def6e60c93abb088ad5ac2010c83", + "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83", "shasum": "" }, "require": { + "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": ">=5.1.2" @@ -1313,7 +1409,57 @@ "phpcs", "standards" ], - "time": "2016-01-19 23:39:10" + "time": "2016-07-13 23:29:13" + }, + { + "name": "webmozart/assert", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308", + "shasum": "" + }, + "require": { + "php": "^5.3.3|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2016-08-09 15:02:57" } ], "aliases": [], diff --git a/vendor/cloudflare/cloudflare-plugin-backend/CHANGELOG.md b/vendor/cloudflare/cloudflare-plugin-backend/CHANGELOG.md index 35013bb6..c87ea0f1 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/CHANGELOG.md +++ b/vendor/cloudflare/cloudflare-plugin-backend/CHANGELOG.md @@ -2,6 +2,48 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [1.1.0](#1.1.0) - 2016-08-11 +### Added +- Added CF\Router\RequestRouter to consolidate duplicate request routing logic each plugin was implementing. [#8](https://github.com/cloudflare/cloudflare-plugin-backend/pull/8) +### Changed +- PluginRoutes, PluginActions moved to CF\API to consolidate the Internal Plugin API logic across all plugins. [#10](https://github.com/cloudflare/cloudflare-plugin-backend/pull/10) + +## [1.0.9](#1.0.9) - 2016-08-03 +### Changed +- Removed static type checking to support earlier php versions [ad13c1e](https://github.com/cloudflare/cloudflare-plugin-backend/commit/ad13c1ec6edeceae5a85f8912208ce2c80f4a5f2) + +## [1.0.8](#1.0.8) - 2016-08-02 +### Changed +- Fixed error message bug [61584ca](https://github.com/cloudflare/cloudflare-plugin-backend/commit/61584ca56f8ed6ba76cb321593955e0b57f3c88d) + +## [1.0.7](#1.0.7) - 2016-08-02 +### Changed +- Updated CHANGELOG [5e72177](https://github.com/cloudflare/cloudflare-plugin-backend/commit/5e72177aadf1c34cf75904b52bf017e7b6c6c672) + +## [1.0.6](#1.0.6) - 2016-08-02 +### Changed +- Changed error message from always "Bad Request" to original API message [235b020](https://github.com/cloudflare/cloudflare-plugin-backend/commit/235b020ad48cf9c0d2cdcb067b34d1424f0571f6) + +## [1.0.5](#1.0.5) - 2016-07-22 +### Added +- PI-697 added PLUGIN_SPECIFIC_CACHE consts to CF\API\Plugin [10fb134](https://github.com/cloudflare/cloudflare-plugin-backend/commit/10fb1346d81e6b7fb71abfdfb93ce12c3d55fb91) + +## [1.0.4](#1.0.4) - 2016-07-15 +### Added +- Added setting name consts to CF\API\Plugin [70372ab](https://github.com/cloudflare/cloudflare-plugin-backend/commit/70372ab0d1e294e0e6b57799e31c8a22ed4dedf6) + + +## [1.0.3](#1.0.3) - 2016-06-27 +### Added +- Added CF\API\Plugin.php built by @thellimist to handle plugin specific API calls. [#3](https://github.com/cloudflare/cloudflare-plugin-backend/pull/3) + +## [1.0.2](#1.0.2) - 2016-06-14 +### Changed +- CF\Integration\LoggerInterface::logAPICall() moved to CF\API\AbstractAPIClient::logAPICall(). [#2](https://github.com/cloudflare/cloudflare-plugin-backend/pull/2) + +## Removed +- Removed CF\Integration\LoggerInterface. [#2](https://github.com/cloudflare/cloudflare-plugin-backend/pull/2) + ## [1.0.1](#1.0.1) - 2016-06-07 ### Changed -- CF\Integration\LoggerInterface now implements PSR-3 LoggerInterface [#1](https://github.com/cloudflare/cloudflare-plugin-backend/pull/1) +- CF\Integration\LoggerInterface now implements PSR-3 LoggerInterface. [#1](https://github.com/cloudflare/cloudflare-plugin-backend/pull/1) diff --git a/vendor/cloudflare/cloudflare-plugin-backend/composer.json b/vendor/cloudflare/cloudflare-plugin-backend/composer.json index 850bba8e..8d45acdc 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/composer.json +++ b/vendor/cloudflare/cloudflare-plugin-backend/composer.json @@ -2,7 +2,7 @@ "name": "cloudflare/cloudflare-plugin-backend", "description": "A PHP backend for CloudFlare plugins.", "license": "BSD-3-Clause", - "version": "1.0.1", + "version": "1.1.0", "scripts": { "test": "vendor/bin/phpunit", "format": "vendor/bin/phpcs -n --standard=PSR2 --extensions=php,live.php src/" diff --git a/vendor/cloudflare/cloudflare-plugin-backend/composer.lock b/vendor/cloudflare/cloudflare-plugin-backend/composer.lock index db77ac65..545a39fe 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/composer.lock +++ b/vendor/cloudflare/cloudflare-plugin-backend/composer.lock @@ -4,21 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "df982ae9219156f01be914fdc1bba16f", - "content-hash": "9931ed117dddd3668b80df1c29de7734", + "hash": "f887449dc6157ac9f04c5b7fcf003229", + "content-hash": "00292135fbc8ae1a789cc19840367a35", "packages": [ { "name": "guzzlehttp/guzzle", - "version": "5.3.0", + "version": "5.3.1", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f3c8c22471cb55475105c14769644a49c3262b93" + "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f3c8c22471cb55475105c14769644a49c3262b93", - "reference": "f3c8c22471cb55475105c14769644a49c3262b93", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/70f1fa53b71c4647bf2762c09068a95f77e12fb8", + "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8", "shasum": "" }, "require": { @@ -27,15 +27,9 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0", - "psr/log": "^1.0" + "phpunit/phpunit": "^4.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, "autoload": { "psr-4": { "GuzzleHttp\\": "src/" @@ -63,7 +57,7 @@ "rest", "web service" ], - "time": "2015-05-20 03:47:55" + "time": "2016-07-15 19:28:39" }, { "name": "guzzlehttp/ringphp", @@ -304,39 +298,136 @@ ], "time": "2015-06-14 21:17:01" }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2015-12-27 11:43:31" + }, { "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" }, "require-dev": { - "phpunit/phpunit": "~4.0" + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "type": "library", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "time": "2016-06-10 09:48:41" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "psr-0": { - "phpDocumentor": [ + "psr-4": { + "phpDocumentor\\Reflection\\": [ "src/" ] } @@ -348,39 +439,39 @@ "authors": [ { "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" + "email": "me@mikevanriel.com" } ], - "time": "2015-02-03 12:10:50" + "time": "2016-06-10 07:14:17" }, { "name": "phpspec/prophecy", - "version": "v1.6.0", + "version": "v1.6.1", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" + "reference": "58a8137754bc24b25740d4281399a4a3596058e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", + "reference": "58a8137754bc24b25740d4281399a4a3596058e0", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1", - "sebastian/recursion-context": "~1.0" + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1", + "sebastian/recursion-context": "^1.0" }, "require-dev": { - "phpspec/phpspec": "~2.0" + "phpspec/phpspec": "^2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -413,7 +504,7 @@ "spy", "stub" ], - "time": "2016-02-15 07:46:21" + "time": "2016-06-07 08:13:47" }, { "name": "phpunit/php-code-coverage", @@ -660,16 +751,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.26", + "version": "4.8.27", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74" + "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74", - "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c062dddcb68e44b563f66ee319ddae2b5a322a90", + "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90", "shasum": "" }, "require": { @@ -728,7 +819,7 @@ "testing", "xunit" ], - "time": "2016-05-17 03:09:28" + "time": "2016-07-21 06:48:14" }, { "name": "phpunit/phpunit-mock-objects", @@ -954,16 +1045,16 @@ }, { "name": "sebastian/exporter", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", "shasum": "" }, "require": { @@ -971,12 +1062,13 @@ "sebastian/recursion-context": "~1.0" }, "require-dev": { + "ext-mbstring": "*", "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -1016,7 +1108,7 @@ "export", "exporter" ], - "time": "2015-06-21 07:55:53" + "time": "2016-06-17 09:04:28" }, { "name": "sebastian/global-state", @@ -1159,16 +1251,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "2.6.1", + "version": "2.6.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "fb72ed32f8418db5e7770be1653e62e0d6f5dd3d" + "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/fb72ed32f8418db5e7770be1653e62e0d6f5dd3d", - "reference": "fb72ed32f8418db5e7770be1653e62e0d6f5dd3d", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4edb770cb853def6e60c93abb088ad5ac2010c83", + "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83", "shasum": "" }, "require": { @@ -1233,29 +1325,29 @@ "phpcs", "standards" ], - "time": "2016-05-30 22:24:32" + "time": "2016-07-13 23:29:13" }, { "name": "symfony/yaml", - "version": "v2.8.6", + "version": "v3.1.3", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e4fbcc65f90909c999ac3b4dfa699ee6563a9940" + "reference": "1819adf2066880c7967df7180f4f662b6f0567ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e4fbcc65f90909c999ac3b4dfa699ee6563a9940", - "reference": "e4fbcc65f90909c999ac3b4dfa699ee6563a9940", + "url": "https://api.github.com/repos/symfony/yaml/zipball/1819adf2066880c7967df7180f4f662b6f0567ac", + "reference": "1819adf2066880c7967df7180f4f662b6f0567ac", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.5.9" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "3.1-dev" } }, "autoload": { @@ -1282,7 +1374,57 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2016-03-29 19:00:15" + "time": "2016-07-17 14:02:08" + }, + { + "name": "webmozart/assert", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308", + "shasum": "" + }, + "require": { + "php": "^5.3.3|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2016-08-09 15:02:57" } ], "aliases": [], diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractAPIClient.php b/vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractAPIClient.php index 0202106d..2999fc83 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractAPIClient.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractAPIClient.php @@ -8,9 +8,8 @@ abstract class AbstractAPIClient implements APIInterface { - - const CONTENT_TYPE_KEY = "Content-Type"; - const APPLICATION_JSON_KEY = "application/json"; + const CONTENT_TYPE_KEY = 'Content-Type'; + const APPLICATION_JSON_KEY = 'application/json'; protected $config; protected $data_store; @@ -30,6 +29,7 @@ public function __construct(IntegrationInterface $integration) /** * @param Request $request + * * @return array|mixed */ public function callAPI(Request $request) @@ -39,15 +39,15 @@ public function callAPI(Request $request) $request = $this->beforeSend($request); - $bodyType = (($request->getHeaders()[self::CONTENT_TYPE_KEY] === self::APPLICATION_JSON_KEY) ? "json" : "body"); + $bodyType = (($request->getHeaders()[self::CONTENT_TYPE_KEY] === self::APPLICATION_JSON_KEY) ? 'json' : 'body'); $requestOptions = array( 'headers' => $request->getHeaders(), 'query' => $request->getParameters(), - $bodyType => $request->getBody() + $bodyType => $request->getBody(), ); - if ($this->config->getValue("debug")) { + if ($this->config->getValue('debug')) { $requestOptions['debug'] = fopen('php://stderr', 'w'); } @@ -56,30 +56,76 @@ public function callAPI(Request $request) $response = $client->send($apiRequest)->json(); if (json_last_error() !== JSON_ERROR_NONE) { - throw new RequestException("Error decoding client API JSON", $response); + throw new RequestException('Error decoding client API JSON', $response); } if (!$this->responseOk($response)) { - $this->logger->logAPICall($this->getAPIClientName(), array('type' => 'response', 'body' => $response), false); + $this->logAPICall($this->getAPIClientName(), array('type' => 'response', 'body' => $response), true); } return $response; } catch (RequestException $e) { - $this->logger->logAPICall($this->getAPIClientName(), array( - 'type' => "request", + $errorMessage = $this->getErrorMessage($e); + + $this->logAPICall($this->getAPIClientName(), array( + 'type' => 'request', 'method' => $request->getMethod(), 'path' => $request->getUrl(), 'headers' => $request->getHeaders(), 'params' => $request->getParameters(), - 'body' => $request->getBody()), false); - $this->logger->logAPICall($this->getAPIClientName(), array('type' => "response", 'code' => $e->getCode(), 'body' => $e->getMessage(), 'stacktrace' => $e->getTraceAsString()), false); - return $this->createAPIError($e->getMessage()); + 'body' => $request->getBody(), ), true); + $this->logAPICall($this->getAPIClientName(), array('type' => 'response', 'code' => $e->getCode(), 'body' => $errorMessage, 'stacktrace' => $e->getTraceAsString()), true); + + return $this->createAPIError($errorMessage); } } + /** + * @param RequestException $object + * + * @return string + */ + public function getErrorMessage(RequestException $error) + { + return $error->getMessage(); + } + + /** + * @param string $apiName + * @param array $message + * @param bool $isError + */ + public function logAPICall($apiName, $message, $isError) + { + $logLevel = 'error'; + if ($isError === false) { + $logLevel = 'debug'; + } + + if (!is_string($message)) { + $message = print_r($message, true); + } + + $this->logger->$logLevel('['.$apiName.'] '.$message); + } /** * @param Request $request + * @return string + */ + public function getPath(Request $request) + { + //substring of everything after the endpoint is the path + return substr($request->getUrl(), strpos($request->getUrl(), $this->getEndpoint()) + strlen($this->getEndpoint())); + } + + function shouldRouteRequest(Request $request) { + return (strpos($request->getUrl(), $this->getEndpoint()) !== false); + } + + /** + * @param Request $request + * * @return mixed */ abstract public function beforeSend(Request $request); @@ -88,4 +134,16 @@ abstract public function beforeSend(Request $request); * @return mixed */ abstract public function getAPIClientName(); + + /** + * @param $message + * + * @return array + */ + abstract public function createAPIError($message); + + /** + * @return mixed + */ + abstract public function getEndpoint(); } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractPluginActions.php b/vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractPluginActions.php new file mode 100644 index 00000000..4690f4df --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/API/AbstractPluginActions.php @@ -0,0 +1,202 @@ +api = $api; + $this->config = $defaultIntegration->getConfig(); + $this->integrationAPI = $defaultIntegration->getIntegrationAPI(); + $this->dataStore = $defaultIntegration->getDataStore(); + $this->logger = $defaultIntegration->getLogger(); + $this->request = $request; + + $this->clientAPI = new Client($defaultIntegration); + } + + /** + * @param APIInterface $api + */ + public function setAPI(APIInterface $api) { + $this->api = $api; + } + + /** + * @param Request $request + */ + public function setRequest(Request $request) { + $this->request = $request; + } + + /** + * @param APIInterface $clientAPI + */ + public function setClientAPI(APIInterface $clientAPI) { + $this->clientAPI = $clientAPI; + } + + /** + * @param DataStoreInterface $dataStore + */ + public function setDataStore(DataStoreInterface $dataStore) { + $this->dataStore = $dataStore; + } + + public function setLogger(\Psr\Log\LoggerInterface $logger) { + $this->logger = $logger; + } + + /** + * POST /account. + * + * @return mixed + */ + public function login() + { + $requestBody = $this->request->getBody(); + if(empty($requestBody["apiKey"])) { + return $this->api->createAPIError("Missing required parameter: 'apiKey'."); + } + if(empty($requestBody["email"])) { + return $this->api->createAPIError("Missing required parameter: 'email'."); + } + + $isCreated = $this->dataStore->createUserDataStore($requestBody["apiKey"], $requestBody["email"], null, null); + + if (!$isCreated) { + $this->logger->error('Creating user data to store failed'); + + return $this->api->createAPIError('Unable to save user credentials'); + } + + $response = $this->api->createAPISuccessResponse(array('email' => $requestBody["email"])); + + return $response; + } + + /** + * GET /plugin/:zonedId/settings. + * + * @return mixed + */ + public function getPluginSettings() + { + $settingsList = Plugin::getPluginSettingsKeys(); + + $formattedSettings = array(); + foreach ($settingsList as $setting) { + $value = $this->dataStore->get($setting); + array_push($formattedSettings, $this->api->createPluginResult($setting, $value, true, '')); + } + + $response = $this->api->createAPISuccessResponse( + $formattedSettings + ); + + return $response; + } + + /** + * PATCH /plugin/:zonedId/settings/:settingId. + * + * Routes custom settingIds and default settingsIds + * to different functions + * + * @return mixed + */ + public function patchPluginSettingsRouter() + { + $path_array = explode('/', $this->request->getUrl()); + $settingId = $path_array[3]; + + $response = null; + if ($settingId === Plugin::SETTING_DEFAULT_SETTINGS) { + $response = $this->patchPluginDefaultSettings(); + } else { + $response = $this->patchPluginSettings(); + } + + return $response; + } + + /** + * For PATCH /plugin/:zonedId/settings/:settingId where :settingId is not predefined. + * + * @return mixed + */ + public function patchPluginSettings() + { + $path_array = explode('/', $this->request->getUrl()); + $settingId = $path_array[3]; + + $value = $this->request->getBody()['value']; + $options = $this->dataStore->set($settingId, $value); + + if (!isset($options)) { + return $this->api->createAPIError('Unable to update plugin settings'); + } + + $response = $this->api->createAPISuccessResponse( + array( + $this->api->createPluginResult($settingId, $value, true, ''), + ) + ); + + return $response; + } + + /** + * For PATCH /plugin/:zonedId/settings/:settingId where :settingId is Plugin::SETTING_DEFAULT_SETTINGS. + * @return mixed + * @throws \Exception + */ + public function patchPluginDefaultSettings() + { + $this->dataStore->set(Plugin::SETTING_DEFAULT_SETTINGS, true); + + try { + $this->applyDefaultSettings(); + } catch(\Exception $e) { + if($e instanceof Exception\CloudFlareException) { + return $this->api->createAPIError($e->getMessage()); + } else { + throw $e; + } + } + + + return $this->api->createAPISuccessResponse( + array( + $this->api->createPluginResult(Plugin::SETTING_DEFAULT_SETTINGS, "on", true, ''), + ) + ); + } + + /** + * Children should implement this method to apply the plugin specific default settings + * + * @return mixed + */ + public abstract function applyDefaultSettings(); +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/API/Client.php b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Client.php index 8f0e8774..2405c9ee 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/API/Client.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Client.php @@ -1,18 +1,19 @@ $this->data_store->getClientV4APIKey(), self::X_AUTH_EMAIL => $this->data_store->getCloudFlareEmail(), - self::CONTENT_TYPE_KEY => self::APPLICATION_JSON_KEY + self::CONTENT_TYPE_KEY => self::APPLICATION_JSON_KEY, ); $request->setHeaders($headers); @@ -29,11 +30,13 @@ public function beforeSend(Request $request) /** * @param $message + * * @return array */ public function createAPIError($message) { $this->logger->error($message); + return array( 'result' => null, 'success' => false, @@ -41,19 +44,37 @@ public function createAPIError($message) array( 'code' => '', 'message' => $message, - ) + ), ), - 'messages' => array() + 'messages' => array(), ); } + /** + * @param RequestException error + * + * @return string + */ + public function getErrorMessage(RequestException $error) + { + $jsonResponse = json_decode($error->getResponse()->getBody(), true); + $errorMessage = $error->getMessage(); + + if (count($jsonResponse['errors']) > 0) { + $errorMessage = $jsonResponse['errors'][0]['message']; + } + + return $errorMessage; + } + /** * @param $response + * * @return bool */ public function responseOk($response) { - return ($response["success"] === true); + return $response['success'] === true; } /** @@ -73,13 +94,16 @@ public function getAPIClientName() } /** - * GET /zones/:id + * GET /zones/:id. + * * @param $zone_tag + * * @return string */ public function zoneGetDetails($zone_tag) { - $request = new Request("GET", "zones/" . $zone_tag, array(), array()); + $request = new Request('GET', 'zones/'.$zone_tag, array(), array()); + return $this->callAPI($request); } } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/API/Exception/CloudFlareException.php b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Exception/CloudFlareException.php new file mode 100644 index 00000000..055c2c41 --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Exception/CloudFlareException.php @@ -0,0 +1,8 @@ +setUrl(self::ENDPOINT_PATH); $headers = array( - self::CF_INTEGRATION_HEADER => $this->config->getValue("integrationName"), - self::CF_INTEGRTATION_VERSION_HEADER => $this->config->getValue("version"), + self::CF_INTEGRATION_HEADER => $this->config->getValue('integrationName'), + self::CF_INTEGRTATION_VERSION_HEADER => $this->config->getValue('version'), ); $request->setHeaders($headers); $body = $request->getBody(); $user_key_actions = array('zone_set', 'full_zone_set'); if (in_array(strtolower($body['act']), $user_key_actions)) { - $body["user_key"] = $this->data_store->getHostAPIUserKey(); + $body['user_key'] = $this->data_store->getHostAPIUserKey(); } $body['host_key'] = $this->integrationAPI->getHostAPIKey(); $request->setBody($body); @@ -43,11 +41,21 @@ public function beforeSend(Request $request) /** * @param $host_api_response + * * @return bool */ public function responseOk($host_api_response) { - return ($host_api_response['result'] === 'success'); + return $host_api_response['result'] === 'success'; + } + + /** + * @param Request $request + * @return mixed + */ + public function getPath(Request $request) + { + return $request->getBody()['act']; } /** @@ -68,17 +76,26 @@ public function getAPIClientName() /** * @param $message + * * @return array */ public function createAPIError($message) { return array( 'request' => array( - 'act' => '' + 'act' => '', ), 'result' => 'error', 'msg' => $message, - 'err_code' => '' + 'err_code' => '', ); } + + /** + * @param Request $request + * @return bool + */ + function shouldRouteRequest(Request $request) { + return ($request->getUrl() === $this->getEndpoint()); + } } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/API/Plugin.php b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Plugin.php new file mode 100644 index 00000000..baeddeac --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Plugin.php @@ -0,0 +1,72 @@ +logger->error('CF\\Wordpress\\API\\Plugin\\callAPI should never be called'); + + return $this->createAPIError('The url: '.$request->getUrl().' is not a valid path.'); + } + + public function createAPISuccessResponse($result) + { + return array( + 'success' => true, + 'result' => $result, + 'messages' => [], + 'errors' => [], + ); + } + + public function createPluginResult($id, $value, $editable, $modified_on) + { + return array( + 'id' => $id, + 'value' => $value, + 'editable' => $editable, + 'modified_on' => $modified_on, + ); + } +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/API/PluginRoutes.php b/vendor/cloudflare/cloudflare-plugin-backend/src/API/PluginRoutes.php new file mode 100644 index 00000000..1ce2ceee --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/API/PluginRoutes.php @@ -0,0 +1,35 @@ + array( + 'class' => 'CF\API\AbstractPluginActions', + 'methods' => array( + 'POST' => array( + 'function' => 'login', + ), + ), + ), + + 'plugin/:id/settings' => array( + 'class' => 'CF\API\AbstractPluginActions', + 'methods' => array( + 'GET' => array( + 'function' => 'getPluginSettings', + ), + ), + ), + + 'plugin/:id/settings/:human_readable_id' => array( + 'class' => 'CF\API\AbstractPluginActions', + 'methods' => array( + 'PATCH' => array( + 'function' => 'patchPluginSettingsRouter', + ), + ), + ), + ); +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/API/Request.php b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Request.php index 6bdcda89..6faf8669 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/API/Request.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/API/Request.php @@ -4,7 +4,6 @@ class Request { - private $method; private $url; private $parameters; diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/DNSRecord.php b/vendor/cloudflare/cloudflare-plugin-backend/src/DNSRecord.php index d7a7ab52..d28dbf01 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/DNSRecord.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/DNSRecord.php @@ -3,7 +3,7 @@ * Created by IntelliJ IDEA. * User: johnwineman * Date: 4/18/16 - * Time: 2:40 PM + * Time: 2:40 PM. */ namespace CF; diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/ConfigInterface.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/ConfigInterface.php index 87e8d0a8..447d9b7e 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/ConfigInterface.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/ConfigInterface.php @@ -4,9 +4,9 @@ interface ConfigInterface { - /** * @param $key + * * @return mixed */ public function getValue($key); diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DataStoreInterface.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DataStoreInterface.php index c5591d1d..faac2679 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DataStoreInterface.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DataStoreInterface.php @@ -4,12 +4,12 @@ interface DataStoreInterface { - /** * @param $client_api_key * @param $email * @param $unique_id * @param $user_key + * * @return mixed */ public function createUserDataStore($client_api_key, $email, $unique_id, $user_key); @@ -33,4 +33,17 @@ public function getHostAPIUserKey(); * @return mixed */ public function getCloudFlareEmail(); + + /** + * @param $key + * @return mixed + */ + public function get($key); + + /** + * @param $key + * @param $value + * @return mixed + */ + public function set($key, $value); } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultConfig.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultConfig.php index e2b9a265..a4eb5a30 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultConfig.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultConfig.php @@ -1,4 +1,5 @@ config)) { $value = $this->config[$key]; } + return $value; } } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultIntegration.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultIntegration.php index c8227c0a..35fb4d04 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultIntegration.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultIntegration.php @@ -2,6 +2,7 @@ namespace CF\Integration; +use Psr\Log\LoggerInterface; class DefaultIntegration implements IntegrationInterface { @@ -11,10 +12,10 @@ class DefaultIntegration implements IntegrationInterface private $logger; /** - * @param ConfigInterface $config - * @param IntegrationAPIInterface $integrationAPI - * @param DataStoreInterface $dataStore - * @param LoggerInterface $logger + * @param ConfigInterface $config + * @param IntegrationAPIInterface $integrationAPI + * @param DataStoreInterface $dataStore + * @param LoggerInterface|\Psr\Log\LoggerInterface $logger */ public function __construct(ConfigInterface $config, IntegrationAPIInterface $integrationAPI, DataStoreInterface $dataStore, LoggerInterface $logger) { @@ -87,4 +88,4 @@ public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } -} \ No newline at end of file +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultLogger.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultLogger.php index 42dd3f11..1958e699 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultLogger.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/DefaultLogger.php @@ -1,14 +1,16 @@ debug) { - return $this->log(LogLevel::DEBUG, $message, $context); - } - } - - public function logAPICall($api, $message, $is_debug) - { - - $log_level = "error"; - if ($is_debug) { - $log_level = "debug"; + if ($this->debug) { + return $this->log(LogLevel::DEBUG, $message, $context); } - - if (!is_string($message)) { - $message = print_r($message, true); - } - - $this->$log_level("[" . $api . "] " . $message); } } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/IntegrationAPIInterface.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/IntegrationAPIInterface.php index a22eecd6..517cbb18 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/IntegrationAPIInterface.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/IntegrationAPIInterface.php @@ -6,9 +6,9 @@ interface IntegrationAPIInterface { - /** * @param $domain_name + * * @return mixed */ public function getDNSRecords($domain_name); @@ -16,6 +16,7 @@ public function getDNSRecords($domain_name); /** * @param $domain_name * @param DNSRecord $DNSRecord + * * @return mixed */ public function addDNSRecord($domain_name, DNSRecord $DNSRecord); @@ -23,6 +24,7 @@ public function addDNSRecord($domain_name, DNSRecord $DNSRecord); /** * @param $domain_name * @param DNSRecord $DNSRecord + * * @return mixed */ public function editDNSRecord($domain_name, DNSRecord $DNSRecord); @@ -30,6 +32,7 @@ public function editDNSRecord($domain_name, DNSRecord $DNSRecord); /** * @param $domain_name * @param DNSRecord $DNSRecord + * * @return mixed */ public function removeDNSRecord($domain_name, DNSRecord $DNSRecord); @@ -41,6 +44,7 @@ public function getHostAPIKey(); /** * @param null $userId + * * @return mixed */ public function getDomainList($userId = null); diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/LoggerInterface.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/LoggerInterface.php deleted file mode 100644 index 5bb323f0..00000000 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Integration/LoggerInterface.php +++ /dev/null @@ -1,14 +0,0 @@ - "[0-9a-z]{32}", - ":bigint_id" => "[0-9]{1,19}", - ":human_readable_id" => "[-0-9a-z_]{1,120}", - ":rayid" => "[0-9a-z]{16}", - ":firewall_rule_id" => "[0-9a-zA-Z\\-_]{1,160}", - ":file_name" => "[0-9A-Za-z_\\.\\-]{1,120}", - ":uuid" => "[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}" + ':id' => '[0-9a-z]{32}', + ':bigint_id' => '[0-9]{1,19}', + ':human_readable_id' => '[-0-9a-z_]{1,120}', + ':rayid' => '[0-9a-z]{16}', + ':firewall_rule_id' => '[0-9a-zA-Z\\-_]{1,160}', + ':file_name' => '[0-9A-Za-z_\\.\\-]{1,120}', + ':uuid' => '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}', ); - /** * @param IntegrationInterface $integration - * @param APIInterface $api + * @param APIInterface $api * @param $routes */ public function __construct(IntegrationInterface $integration, APIInterface $api, $routes) @@ -45,20 +44,21 @@ public function __construct(IntegrationInterface $integration, APIInterface $api $this->routes = $routes; } - /** * @param Request $request + * * @return mixed */ public function route(Request $request) { - $request->setUrl($this->getPath($request)); + $request->setUrl($this->api->getPath($request)); $routeParameters = $this->getRoute($request); if ($routeParameters) { $class = $routeParameters['class']; $function = $routeParameters['function']; $routeClass = new $class($this->integration, $this->api, $request); + return $routeClass->$function(); } else { return $this->api->callAPI($request); @@ -67,6 +67,7 @@ public function route(Request $request) /** * @param Request $request + * * @return string */ public function getPath(Request $request) @@ -74,10 +75,10 @@ public function getPath(Request $request) //substring of everything after the endpoint is the path return substr($request->getUrl(), strpos($request->getUrl(), $this->api->getEndpoint()) + strlen($this->api->getEndpoint())); } - - + /** * @param Request $request + * * @return array|bool */ public function getRoute(Request $request) @@ -97,16 +98,17 @@ public function getRoute(Request $request) ); //Check to see if this is our route - if (preg_match('#^' . $regex . '/?$#', $request->getUrl())) { - if (in_array($request->getMethod(), $route_details_array["methods"]) || array_key_exists( + if (preg_match('#^'.$regex.'/?$#', $request->getUrl())) { + if (in_array($request->getMethod(), $route_details_array['methods']) || array_key_exists( $request->getMethod(), - $route_details_array["methods"] + $route_details_array['methods'] ) ) { - $this->logger->debug("Route matched for " . $request->getMethod() . $request->getUrl() . " now using " . $route_details_array["methods"][$request->getMethod()]['function']); + $this->logger->debug('Route matched for '.$request->getMethod().$request->getUrl().' now using '.$route_details_array['methods'][$request->getMethod()]['function']); + return array( - 'class' => $route_details_array["class"], - 'function' => $route_details_array["methods"][$request->getMethod()]['function'] + 'class' => $route_details_array['class'], + 'function' => $route_details_array['methods'][$request->getMethod()]['function'], ); } } @@ -124,7 +126,6 @@ public function getAPIClient() return $this->api; } - /** * @param $routes */ diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Router/HostAPIRouter.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Router/HostAPIRouter.php deleted file mode 100644 index c9ef803f..00000000 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Router/HostAPIRouter.php +++ /dev/null @@ -1,18 +0,0 @@ -getBody()['act']; - } -} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Router/RequestRouter.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Router/RequestRouter.php new file mode 100644 index 00000000..53fcdfc2 --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Router/RequestRouter.php @@ -0,0 +1,62 @@ +integrationContext = $integrationContext; + $this->routerList = array(); + } + + /** + * @param $clientClassName + * @param $routes + */ + public function addRouter($clientClassName, $routes) { + $client = new $clientClassName($this->integrationContext); + $router = new DefaultRestAPIRouter($this->integrationContext, $client, $routes); + $this->routerList[$client->getAPIClientName()] = $router; + } + + /** + * @return array + */ + public function getRouterList() { + return $this->routerList; + } + + + /** + * @param $routerList + */ + public function setRouterList($routerList) { + $this->routerList = $routerList; + } + + /** + * @param Request $request + * @return bool + */ + public function route(Request $request) { + foreach($this->getRouterList() as $router) { + if($router->getAPIClient()->shouldRouteRequest($request)) { + return $router->route($request); + } + } + + return null; + } +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Router/RouterInterface.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Router/RouterInterface.php index 4b9d7254..4636f805 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Router/RouterInterface.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Router/RouterInterface.php @@ -8,5 +8,4 @@ interface RouterInterface { public function route(Request $request); public function getAPIClient(); - public function getPath(Request $request); } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/SecurityUtil.php b/vendor/cloudflare/cloudflare-plugin-backend/src/SecurityUtil.php index 54deac3b..aded1a49 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/SecurityUtil.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/SecurityUtil.php @@ -4,7 +4,6 @@ class SecurityUtil { - /** * @return bool|string */ @@ -12,10 +11,10 @@ public static function generate16bytesOfSecureRandomData() { if (function_exists('random_bytes')) { $randBytes = random_bytes(16); - } else if (function_exists('mcrypt_create_iv')) { + } elseif (function_exists('mcrypt_create_iv')) { srand(); $randBytes = mcrypt_create_iv(16); - } else if (function_exists('openssl_random_pseudo_bytes')) { + } elseif (function_exists('openssl_random_pseudo_bytes')) { $wasItSecure = false; $randBytes = openssl_random_pseudo_bytes(16, $wasItSecure); if ($wasItSecure === false) { @@ -24,6 +23,7 @@ public static function generate16bytesOfSecureRandomData() } else { return false; } + return bin2hex($randBytes); } @@ -31,6 +31,7 @@ public static function generate16bytesOfSecureRandomData() * @param $secret - string a cryptographically strong secret * @param $user - string a piece of unique user data * @param $timeValidUntil - int of time the token will be valid for in seconds + * * @return string */ public static function csrfTokenGenerate($secret, $user, $timeValidUntil = null) @@ -38,29 +39,31 @@ public static function csrfTokenGenerate($secret, $user, $timeValidUntil = null) if ($timeValidUntil === null) { $timeValidUntil = time() + 86400; } - $hashedSecret = hash("sha512", $secret); - $dataToHash = sprintf("%s-%s-%s", $hashedSecret, $user, $timeValidUntil); + $hashedSecret = hash('sha512', $secret); + $dataToHash = sprintf('%s-%s-%s', $hashedSecret, $user, $timeValidUntil); $hashedData = static::hashFunction($dataToHash); - return sprintf("%s-%s", $timeValidUntil, $hashedData); + + return sprintf('%s-%s', $timeValidUntil, $hashedData); } /** * @param $secret - string a cryptographically strong secret * @param $user - string a piece of unique user data * @param $token- string the token that needs to be validated. + * * @return bool */ public static function csrfTokenValidate($secret, $user, $token) { - $tokenParts = explode("-", $token); + $tokenParts = explode('-', $token); if (count($tokenParts) !== 2) { return false; } list($timeValidFor, $hash) = $tokenParts; - $hashedSecret = hash("sha512", $secret); - $dataToHash = sprintf("%s-%s-%s", $hashedSecret, $user, $timeValidFor); + $hashedSecret = hash('sha512', $secret); + $dataToHash = sprintf('%s-%s-%s', $hashedSecret, $user, $timeValidFor); $newHash = static::hashFunction($dataToHash); if ($newHash !== $hash) { return false; @@ -68,16 +71,19 @@ public static function csrfTokenValidate($secret, $user, $token) if (time() > $timeValidFor) { return false; } + return true; } /** * @param $data - string the data that will be hashed. + * * @return string */ private static function hashFunction($data) { - $hash = hash("sha512", $data); + $hash = hash('sha512', $data); + return substr($hash, 64); } } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractAPIClientTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractAPIClientTest.php new file mode 100644 index 00000000..38bc4325 --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractAPIClientTest.php @@ -0,0 +1,42 @@ +mockRequest = $this->getMockBuilder('CF\API\Request') + ->disableOriginalConstructor() + ->getMock(); + + $this->mockAbstractAPIClient = $this->getMockBuilder('CF\API\AbstractAPIClient') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + } + + public function testGetPathReturnsPath() { + $endpoint = "http://api.cloudflare.com/client/v4"; + $path = "/zones"; + $this->mockRequest->method('getUrl')->willReturn($endpoint.$path); + $this->mockAbstractAPIClient->method('getEndpoint')->willReturn($endpoint); + $this->assertEquals($path, $this->mockAbstractAPIClient->getPath($this->mockRequest)); + } + + public function testShouldRouteRequestReturnsTrueForValidRequest() { + $endpoint = "http://api.cloudflare.com/client/v4"; + $url = $endpoint."/zones"; + $this->mockRequest->method('getUrl')->willReturn($url); + $this->mockAbstractAPIClient->method('getEndpoint')->willReturn($endpoint); + $this->assertTrue($this->mockAbstractAPIClient->shouldRouteRequest($this->mockRequest)); + } + + public function testShouldRouteRequestReturnsFalseForInvalidRequest() { + $this->mockRequest->method('getUrl')->willReturn("http://api.cloudflare.com/client/v4/zones"); + $this->mockAbstractAPIClient->method('getEndpoint')->willReturn("https://api.cloudflare.com/host-gw.html"); + $this->assertFalse($this->mockAbstractAPIClient->shouldRouteRequest($this->mockRequest)); + } +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractPluginActionsTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractPluginActionsTest.php new file mode 100644 index 00000000..2f0ae0eb --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/AbstractPluginActionsTest.php @@ -0,0 +1,91 @@ +mockAPIClient = $this->getMockBuilder('\CF\API\Plugin') + ->disableOriginalConstructor() + ->getMock(); + $this->mockClientAPI = $this->getMockBuilder('\CF\API\Client') + ->disableOriginalConstructor() + ->getMock(); + $this->mockDataStore = $this->getMockBuilder('\CF\Integration\DataStoreInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->mockLogger = $this->getMockBuilder('\Psr\Log\LoggerInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->mockRequest = $this->getMockBuilder('\CF\API\Request') + ->disableOriginalConstructor() + ->getMock(); + $this->mockAbstractPluginActions = $this->getMockBuilder('CF\API\AbstractPluginActions') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $this->mockAbstractPluginActions->setRequest($this->mockRequest); + $this->mockAbstractPluginActions->setAPI($this->mockAPIClient); + $this->mockAbstractPluginActions->setClientAPI($this->mockClientAPI); + $this->mockAbstractPluginActions->setDataStore($this->mockDataStore); + $this->mockAbstractPluginActions->setLogger($this->mockLogger); + + } + + public function testPostAccountSaveAPICredentialsReturnsErrorIfMissingApiKey() { + $this->mockRequest->method('getBody')->willReturn(array( + 'email' => 'email' + )); + $this->mockAPIClient->method('createAPIError')->willReturn(array('success' => false)); + + $response = $this->mockAbstractPluginActions->login(); + + $this->assertFalse($response['success']); + } + + public function testPostAccountSaveAPICredentialsReturnsErrorIfMissingEmail() { + $this->mockRequest->method('getBody')->willReturn(array( + 'apiKey' => 'apiKey' + )); + $this->mockAPIClient->method('createAPIError')->willReturn(array('success' => false)); + + $response = $this->mockAbstractPluginActions->login(); + + $this->assertFalse($response['success']); + } + + public function testPostAccountSaveAPICredentialsReturnsDataStoreEmailIfSuccessful() { + $email = "email"; + $this->mockRequest->method('getBody')->willReturn(array( + 'apiKey' => 'apiKey', + $email => $email + )); + $this->mockAPIClient->method('createAPISuccessResponse')->willReturn(array('email' => $email)); + $this->mockAbstractPluginActions->login(); + } + + public function testGetPluginSettingsReturnsArray() { + $this->mockAPIClient + ->expects($this->once()) + ->method('createAPISuccessResponse') + ->will($this->returnCallback(function($input) { + $this->assertTrue(is_array($input)); + })); + $this->mockAbstractPluginActions->getPluginSettings(); + } + + public function testPatchPluginSettingsReturnsErrorForBadSetting() { + $this->mockRequest->method('getUrl')->willReturn('plugin/:id/settings/nonExistentSetting'); + $this->mockAPIClient->expects($this->once())->method('createAPIError'); + $this->mockAbstractPluginActions->patchPluginSettings(); + } +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/ClientTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/ClientTest.php index 00ba48be..2bb7904f 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/ClientTest.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/ClientTest.php @@ -32,9 +32,10 @@ public function setup() $this->mockClientAPI = new Client($this->mockCpanelIntegration); } - public function testBeforeSendAddsRequestHeaders() { - $apiKey = "apiKey"; - $email = "email"; + public function testBeforeSendAddsRequestHeaders() + { + $apiKey = 'apiKey'; + $email = 'email'; $this->mockDataStore->method('getClientV4APIKey')->willReturn($apiKey); $this->mockDataStore->method('getCloudFlareEmail')->willReturn($email); @@ -46,7 +47,7 @@ public function testBeforeSendAddsRequestHeaders() { $expectedRequestHeaders = array( Client::X_AUTH_KEY => $apiKey, Client::X_AUTH_EMAIL => $email, - Client::CONTENT_TYPE_KEY => Client::APPLICATION_JSON_KEY + Client::CONTENT_TYPE_KEY => Client::APPLICATION_JSON_KEY, ); $this->assertEquals($expectedRequestHeaders[Client::X_AUTH_KEY], $actualRequestHeaders[Client::X_AUTH_KEY]); @@ -63,20 +64,53 @@ public function testClientApiErrorReturnsValidStructure() array( 'code' => '', 'message' => 'Test Message', - ) + ), ), - 'messages' => array() + 'messages' => array(), ); - $errorResponse = $this->mockClientAPI->createAPIError("Test Message"); + $errorResponse = $this->mockClientAPI->createAPIError('Test Message'); $this->assertEquals($errorResponse, $expectedErrorResponse); } public function testResponseOkReturnsTrueForValidResponse() { $v4APIResponse = array( - "success" => true + 'success' => true, ); $this->assertTrue($this->mockClientAPI->responseOk($v4APIResponse)); } + + public function testGetErrorMessageSuccess() + { + $errorMessage = 'I am an error message'; + + $error = $this->getMockBuilder('GuzzleHttp\Exception\RequestException') + ->disableOriginalConstructor() + ->setMethods(array('getResponse', 'getBody', 'getMessage')) + ->getMock(); + + $errorJSON = json_encode( + array( + 'success' => false, + 'errors' => array( + array( + 'message' => $errorMessage, + ), + ), + ) + ); + + $error->expects($this->any()) + ->method('getMessage') + ->will($this->returnValue('Not this message')); + $error->expects($this->any()) + ->method('getResponse') + ->will($this->returnSelf()); + $error->expects($this->any()) + ->method('getBody') + ->will($this->returnValue($errorJSON)); + + $this->assertEquals($errorMessage, $this->mockClientAPI->getErrorMessage($error)); + } } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/HostTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/HostTest.php index b32be9fc..38ca93f7 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/HostTest.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/HostTest.php @@ -20,7 +20,7 @@ public function setup() $this->mockConfig = $this->getMockBuilder('CF\Integration\DefaultConfig') ->disableOriginalConstructor() ->getMock(); - $this->mockAPI= $this->getMockBuilder('CF\Integration\IntegrationAPIInterface') + $this->mockAPI = $this->getMockBuilder('CF\Integration\IntegrationAPIInterface') ->disableOriginalConstructor() ->getMock(); $this->mockDataStore = $this->getMockBuilder('CF\Integration\DataStoreInterface') @@ -32,8 +32,6 @@ public function setup() $this->mockCpanelIntegration = new DefaultIntegration($this->mockConfig, $this->mockAPI, $this->mockDataStore, $this->mockLogger); $this->hostAPI = new Host($this->mockCpanelIntegration); - - } public function testBeforeSendSetsCorrectPath() @@ -44,17 +42,19 @@ public function testBeforeSendSetsCorrectPath() $this->assertEquals(Host::ENDPOINT_PATH, $request->getUrl()); } - public function testBeforeSendSetsIntegrationHeaders() { - $integrationName = "integrationName"; - $version = "version"; + public function testBeforeSendSetsIntegrationHeaders() + { + $integrationName = 'integrationName'; + $version = 'version'; $this->mockConfig->method('getValue')->will( $this->returnValueMap( array( array($integrationName, $integrationName), - array($version, $version) + array($version, $version), ) - )); + ) + ); $request = new Request(null, null, null, null); $request = $this->hostAPI->beforeSend($request); @@ -65,8 +65,9 @@ public function testBeforeSendSetsIntegrationHeaders() { $this->assertEquals($version, $requestHeaders[Host::CF_INTEGRTATION_VERSION_HEADER]); } - public function testBeforeSendSetsUserKeyforActZoneSet() { - $userKey = "userKey"; + public function testBeforeSendSetsUserKeyforActZoneSet() + { + $userKey = 'userKey'; $this->mockDataStore->method('getHostAPIUserKey')->willReturn($userKey); $request = new Request(null, null, null, array('act' => 'zone_set')); @@ -75,11 +76,11 @@ public function testBeforeSendSetsUserKeyforActZoneSet() { $requestBody = $request->getBody(); $this->assertEquals($userKey, $requestBody['user_key']); - } - public function testBeforeSendSetsUserKeyforActFullZoneSet() { - $userKey = "userKey"; + public function testBeforeSendSetsUserKeyforActFullZoneSet() + { + $userKey = 'userKey'; $this->mockDataStore->method('getHostAPIUserKey')->willReturn($userKey); $request = new Request(null, null, null, array('act' => 'full_zone_set')); @@ -88,11 +89,11 @@ public function testBeforeSendSetsUserKeyforActFullZoneSet() { $requestBody = $request->getBody(); $this->assertEquals($userKey, $requestBody['user_key']); - } - public function testBeforeSendSetsHostKey() { - $hostKey = "hostKey"; + public function testBeforeSendSetsHostKey() + { + $hostKey = 'hostKey'; $this->mockAPI->method('getHostAPIKey')->willReturn($hostKey); $request = new Request(null, null, null, null); @@ -101,13 +102,12 @@ public function testBeforeSendSetsHostKey() { $requestBody = $request->getBody(); $this->assertEquals($hostKey, $requestBody['host_key']); - } public function testResponseOkReturnsTrueForValidResponse() { $hostAPIResponse = array( - 'result' => 'success' + 'result' => 'success', ); $this->assertTrue($this->hostAPI->responseOk($hostAPIResponse)); @@ -115,11 +115,22 @@ public function testResponseOkReturnsTrueForValidResponse() public function testClientApiErrorReturnsValidStructure() { - $message = "message"; + $message = 'message'; $errorResponse = $this->hostAPI->createAPIError($message); - $this->assertEquals($message, $errorResponse["msg"]); - $this->assertEquals("error", $errorResponse["result"]); + $this->assertEquals($message, $errorResponse['msg']); + $this->assertEquals('error', $errorResponse['result']); + } + + public function testGetPathReturnsBodyActParameter() { + $act = "act"; + $request = new Request(null,null,null,array($act => $act)); + $this->assertEquals($act, $this->hostAPI->getPath($request)); + } + + public function testShouldRouteRequestReturnsTrueIfUrlsAreEqual() { + $request = new Request(null,Host::ENDPOINT,null,null); + $this->assertTrue($this->hostAPI->shouldRouteRequest($request)); } -} \ No newline at end of file +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/PluginTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/PluginTest.php new file mode 100644 index 00000000..a0206fba --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/API/PluginTest.php @@ -0,0 +1,65 @@ +mockConfig = $this->getMockBuilder('CF\Integration\DefaultConfig') + ->disableOriginalConstructor() + ->getMock(); + $this->mockWordPressAPI = $this->getMockBuilder('CF\Integration\IntegrationAPIInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->mockDataStore = $this->getMockBuilder('CF\Integration\DataStoreInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->mockLogger = $this->getMockBuilder('CF\Integration\DefaultLogger') + ->disableOriginalConstructor() + ->getMock(); + $this->mockDefaultIntegration = new DefaultIntegration($this->mockConfig, $this->mockWordPressAPI, $this->mockDataStore, $this->mockLogger); + $this->pluginAPIClient = new Plugin($this->mockDefaultIntegration); + } + + public function testCreateAPISuccessResponse() + { + $resultString = 'result'; + $resultArray = array('email' => $resultString); + + $firstResponse = $this->pluginAPIClient->createAPISuccessResponse($resultString); + $secondResponse = $this->pluginAPIClient->createAPISuccessResponse($resultArray); + + $this->assertTrue($firstResponse['success']); + $this->assertTrue($secondResponse['success']); + $this->assertEquals($resultString, $firstResponse['result']); + $this->assertEquals($resultArray, $secondResponse['result']); + } + + public function testCreateAPIErrorReturnsError() + { + $response = $this->pluginAPIClient->createAPIError('error Message'); + + $this->assertFalse($response['success']); + } + + public function testCallAPIReturnsError() + { + $request = new Request(null, null, null, null); + + $response = $this->pluginAPIClient->callAPI($request); + + $this->assertFalse($response['success']); + } +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultConfigTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultConfigTest.php index 1cc12da5..2b04db3a 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultConfigTest.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultConfigTest.php @@ -6,10 +6,11 @@ class DefaultConfigTest extends \PHPUnit_Framework_TestCase { - public function testGetValueReturnsCorrectValue() { - $key = "key"; - $value = "value"; - $config = new DefaultConfig(json_encode(array($key => $value ))); + public function testGetValueReturnsCorrectValue() + { + $key = 'key'; + $value = 'value'; + $config = new DefaultConfig(json_encode(array($key => $value))); $this->assertEquals($value, $config->getValue($key)); } -} \ No newline at end of file +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultLoggerTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultLoggerTest.php index aa541cba..fa9296c1 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultLoggerTest.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Integration/DefaultLoggerTest.php @@ -6,13 +6,14 @@ class DefaultLoggerTest extends \PHPUnit_Framework_TestCase { - public function testDebugLogOnlyLogsIfDebugIsEnabled() { + public function testDebugLogOnlyLogsIfDebugIsEnabled() + { $logger = new DefaultLogger(true); - $returnValue = $logger->debug(""); + $returnValue = $logger->debug(''); $this->assertTrue($returnValue); $logger = new DefaultLogger(false); - $returnValue = $logger->debug(""); + $returnValue = $logger->debug(''); $this->assertNull($returnValue); } -} \ No newline at end of file +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/DefaultRestAPIRouterTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/DefaultRestAPIRouterTest.php index ce7f2f2a..87593f24 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/DefaultRestAPIRouterTest.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/DefaultRestAPIRouterTest.php @@ -4,11 +4,10 @@ use CF\API\Request; use CF\Integration\DefaultIntegration; -use \CF\Router\DefaultRestAPIRouter; +use CF\Router\DefaultRestAPIRouter; class DefaultRestAPIRouterTest extends \PHPUnit_Framework_TestCase { - private $clientV4APIRouter; private $mockConfig; private $mockClientAPI; @@ -46,26 +45,26 @@ public function testGetRouteReturnsClassFunctionForValidRoute() 'class' => 'testClass', 'methods' => array( 'GET' => array( - 'function' => 'testFunction' - ) - ) - ) + 'function' => 'testFunction', + ), + ), + ), ); $this->clientV4APIRouter->setRoutes($routes); - $request = new Request("GET", "zones", array(), array()); + $request = new Request('GET', 'zones', array(), array()); $response = $this->clientV4APIRouter->getRoute($request); $this->assertEquals(array( 'class' => 'testClass', - 'function' => 'testFunction' + 'function' => 'testFunction', ), $response); } public function testGetRouteReturnsFalseForNoRouteFound() { - $request = new Request("GET", "zones", array(), array()); + $request = new Request('GET', 'zones', array(), array()); $response = $this->clientV4APIRouter->getRoute($request); $this->assertFalse($response); } diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/HostAPIRouterTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/HostAPIRouterTest.php deleted file mode 100644 index 0d6f8681..00000000 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/HostAPIRouterTest.php +++ /dev/null @@ -1,48 +0,0 @@ -mockConfig = $this->getMockBuilder('CF\Integration\DefaultConfig') - ->disableOriginalConstructor() - ->getMock(); - $this->mockClientAPI = $this->getMockBuilder('CF\API\Host') - ->disableOriginalConstructor() - ->getMock(); - $this->mockAPI = $this->getMockBuilder('CF\Integration\IntegrationAPIInterface') - ->disableOriginalConstructor() - ->getMock(); - $this->mockDataStore = $this->getMockBuilder('CF\Integration\DataStoreInterface') - ->disableOriginalConstructor() - ->getMock(); - $this->mockLogger = $this->getMockBuilder('CF\Integration\DefaultLogger') - ->disableOriginalConstructor() - ->getMock(); - $this->mockIntegration = new DefaultIntegration($this->mockConfig, $this->mockAPI, $this->mockDataStore, $this->mockLogger); - $this->hostAPIRouter = new HostAPIRouter($this->mockIntegration, $this->mockClientAPI, $this->mockRoutes); - } - - public function testGetPathReturnsHostAPIActParameter() - { - $request = new Request(null, null, null, array('act' => 'testAction')); - $path = $this->hostAPIRouter->getPath($request); - $this->assertEquals("testAction", $path); - } -} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/RequestRouterTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/RequestRouterTest.php new file mode 100644 index 00000000..0b8a95ee --- /dev/null +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/Router/RequestRouterTest.php @@ -0,0 +1,63 @@ +mockConfig = $this->getMockBuilder('CF\Integration\DefaultConfig') + ->disableOriginalConstructor() + ->getMock(); + $this->mockAPI = $this->getMockBuilder('CF\Integration\IntegrationAPIInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->mockDataStore = $this->getMockBuilder('CF\Integration\DataStoreInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->mockLogger = $this->getMockBuilder('CF\Integration\DefaultLogger') + ->disableOriginalConstructor() + ->getMock(); + $this->mockIntegration = new DefaultIntegration($this->mockConfig, $this->mockAPI, $this->mockDataStore, $this->mockLogger); + + $this->mockRequest = $this->getMockBuilder('CF\API\Request') + ->disableOriginalConstructor() + ->getMock(); + + $this->requestRouter = new RequestRouter($this->mockIntegration); + } + + public function testAddRouterAddsRouter() { + $this->requestRouter->addRouter('CF\API\Client', null); + $this->assertEquals('CF\Router\DefaultRestAPIRouter', get_class($this->requestRouter->getRouterList()[Client::CLIENT_API_NAME])); + } + + public function testRoutePassesValidRequestToDefaultRestAPIRouter() { + $mockDefaultRestAPIRouter = $this->getMockBuilder('CF\Router\DefaultRestAPIRouter') + ->disableOriginalConstructor() + ->getMock(); + $mockAPIClient = $this->getMockBuilder('CF\API\Client') + ->disableOriginalConstructor() + ->getMock(); + $mockAPIClient->method('shouldRouteRequest')->willReturn(true); + $mockDefaultRestAPIRouter->method('getAPIClient')->willReturn($mockAPIClient); + $mockDefaultRestAPIRouter->expects($this->once())->method('route'); + + $this->requestRouter->setRouterList(array($mockDefaultRestAPIRouter)); + + $this->requestRouter->route($this->mockRequest); + + } +} diff --git a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/SecurityUtilTest.php b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/SecurityUtilTest.php index 027450e1..20028aa7 100644 --- a/vendor/cloudflare/cloudflare-plugin-backend/src/Test/SecurityUtilTest.php +++ b/vendor/cloudflare/cloudflare-plugin-backend/src/Test/SecurityUtilTest.php @@ -4,28 +4,27 @@ class SecurityUtilTest extends \PHPUnit_Framework_TestCase { - public function testCSRFTokenValidateReturnsTrueForValidToken() { - $secret = "secret"; - $user = "user"; + $secret = 'secret'; + $user = 'user'; $token = SecurityUtil::csrfTokenGenerate($secret, $user); $this->assertTrue(SecurityUtil::csrfTokenValidate($secret, $user, $token)); } public function testCSRFTokenValidateReturnsFalseForInvalidToken() { - $secret = "secret"; - $user = "user"; + $secret = 'secret'; + $user = 'user'; $timeValidUntil = time() + 86400; $token = SecurityUtil::csrfTokenGenerate($secret, $user, $timeValidUntil); - $this->assertFalse(SecurityUtil::csrfTokenValidate("bad secret", $user, $token)); + $this->assertFalse(SecurityUtil::csrfTokenValidate('bad secret', $user, $token)); } public function testCSRFTokenValidateReturnsFalseForExpiredToken() { - $secret = "secret"; - $user = "user"; + $secret = 'secret'; + $user = 'user'; $timeValidUntil = time() - 1; $token = SecurityUtil::csrfTokenGenerate($secret, $user, $timeValidUntil); $this->assertFalse(SecurityUtil::csrfTokenValidate($secret, $user, $token)); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 9fb7199f..7f9f77d5 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -41,6 +41,7 @@ 'Generic_Sniffs_Formatting_MultipleStatementAlignmentSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php', 'Generic_Sniffs_Formatting_NoSpaceAfterCastSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php', 'Generic_Sniffs_Formatting_SpaceAfterCastSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php', + 'Generic_Sniffs_Formatting_SpaceAfterNotSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php', 'Generic_Sniffs_Functions_CallTimePassByReferenceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php', 'Generic_Sniffs_Functions_FunctionCallArgumentSpacingSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php', 'Generic_Sniffs_Functions_OpeningFunctionBraceBsdAllmanSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php', @@ -544,6 +545,7 @@ 'PSR2_Sniffs_Files_ClosingTagSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php', 'PSR2_Sniffs_Files_EndFileNewlineSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php', 'PSR2_Sniffs_Methods_FunctionCallSignatureSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php', + 'PSR2_Sniffs_Methods_FunctionClosingBraceSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php', 'PSR2_Sniffs_Methods_MethodDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php', 'PSR2_Sniffs_Namespaces_NamespaceDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php', 'PSR2_Sniffs_Namespaces_UseDeclarationSniff' => $vendorDir . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php', diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index a208647d..c7969d4a 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -6,7 +6,6 @@ $baseDir = dirname($vendorDir); return array( - 'phpDocumentor' => array($vendorDir . '/phpdocumentor/reflection-docblock/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log'), 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'), ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 3039a3b8..e2921ffd 100644 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -6,6 +6,8 @@ $baseDir = dirname($vendorDir); return array( + 'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'), + 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'), 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), 'React\\Promise\\' => array($vendorDir . '/react/promise/src'), 'GuzzleHttp\\Stream\\' => array($vendorDir . '/guzzlehttp/streams/src'), diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 6b5faf2b..3351618d 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -23,24 +23,35 @@ public static function getLoader() self::$loader = $loader = new \Composer\Autoload\ClassLoader(); spl_autoload_unregister(array('ComposerAutoloaderInitb3afba8d614ff1f43cdd7aeb18613292', 'loadClassLoader')); - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } + $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION'); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } + call_user_func(\Composer\Autoload\ComposerStaticInitb3afba8d614ff1f43cdd7aeb18613292::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } } $loader->register(true); - $includeFiles = require __DIR__ . '/autoload_files.php'; + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInitb3afba8d614ff1f43cdd7aeb18613292::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } foreach ($includeFiles as $fileIdentifier => $file) { composerRequireb3afba8d614ff1f43cdd7aeb18613292($fileIdentifier, $file); } diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 00000000..f396a4b7 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,798 @@ + __DIR__ . '/..' . '/react/promise/src/functions_include.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'p' => + array ( + 'phpDocumentor\\Reflection\\' => 25, + ), + 'W' => + array ( + 'Webmozart\\Assert\\' => 17, + ), + 'S' => + array ( + 'Symfony\\Component\\Yaml\\' => 23, + ), + 'R' => + array ( + 'React\\Promise\\' => 14, + ), + 'G' => + array ( + 'GuzzleHttp\\Stream\\' => 18, + 'GuzzleHttp\\Ring\\' => 16, + 'GuzzleHttp\\' => 11, + ), + 'D' => + array ( + 'Doctrine\\Instantiator\\' => 22, + ), + 'C' => + array ( + 'CF\\' => 3, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'phpDocumentor\\Reflection\\' => + array ( + 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src', + 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src', + 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src', + ), + 'Webmozart\\Assert\\' => + array ( + 0 => __DIR__ . '/..' . '/webmozart/assert/src', + ), + 'Symfony\\Component\\Yaml\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/yaml', + ), + 'React\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/react/promise/src', + ), + 'GuzzleHttp\\Stream\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/streams/src', + ), + 'GuzzleHttp\\Ring\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/ringphp/src', + ), + 'GuzzleHttp\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', + ), + 'Doctrine\\Instantiator\\' => + array ( + 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator', + ), + 'CF\\' => + array ( + 0 => __DIR__ . '/../..' . '/src', + 1 => __DIR__ . '/..' . '/cloudflare/cloudflare-plugin-backend/src', + ), + ); + + public static $prefixesPsr0 = array ( + 'P' => + array ( + 'Psr\\Log\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/log', + ), + 'Prophecy\\' => + array ( + 0 => __DIR__ . '/..' . '/phpspec/prophecy/src', + ), + ), + ); + + public static $classMap = array ( + 'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php', + 'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php', + 'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php', + 'Generic_Sniffs_Arrays_DisallowLongArraySyntaxSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Arrays/DisallowLongArraySyntaxSniff.php', + 'Generic_Sniffs_Arrays_DisallowShortArraySyntaxSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Arrays/DisallowShortArraySyntaxSniff.php', + 'Generic_Sniffs_Classes_DuplicateClassNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Classes/DuplicateClassNameSniff.php', + 'Generic_Sniffs_CodeAnalysis_EmptyStatementSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/EmptyStatementSniff.php', + 'Generic_Sniffs_CodeAnalysis_ForLoopShouldBeWhileLoopSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/ForLoopShouldBeWhileLoopSniff.php', + 'Generic_Sniffs_CodeAnalysis_ForLoopWithTestFunctionCallSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/ForLoopWithTestFunctionCallSniff.php', + 'Generic_Sniffs_CodeAnalysis_JumbledIncrementerSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/JumbledIncrementerSniff.php', + 'Generic_Sniffs_CodeAnalysis_UnconditionalIfStatementSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnconditionalIfStatementSniff.php', + 'Generic_Sniffs_CodeAnalysis_UnnecessaryFinalModifierSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnnecessaryFinalModifierSniff.php', + 'Generic_Sniffs_CodeAnalysis_UnusedFunctionParameterSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UnusedFunctionParameterSniff.php', + 'Generic_Sniffs_CodeAnalysis_UselessOverridingMethodSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/CodeAnalysis/UselessOverridingMethodSniff.php', + 'Generic_Sniffs_Commenting_DocCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/DocCommentSniff.php', + 'Generic_Sniffs_Commenting_FixmeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/FixmeSniff.php', + 'Generic_Sniffs_Commenting_TodoSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Commenting/TodoSniff.php', + 'Generic_Sniffs_ControlStructures_InlineControlStructureSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php', + 'Generic_Sniffs_Debug_CSSLintSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/CSSLintSniff.php', + 'Generic_Sniffs_Debug_ClosureLinterSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/ClosureLinterSniff.php', + 'Generic_Sniffs_Debug_JSHintSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Debug/JSHintSniff.php', + 'Generic_Sniffs_Files_ByteOrderMarkSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/ByteOrderMarkSniff.php', + 'Generic_Sniffs_Files_EndFileNewlineSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/EndFileNewlineSniff.php', + 'Generic_Sniffs_Files_EndFileNoNewlineSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/EndFileNoNewlineSniff.php', + 'Generic_Sniffs_Files_InlineHTMLSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/InlineHTMLSniff.php', + 'Generic_Sniffs_Files_LineEndingsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineEndingsSniff.php', + 'Generic_Sniffs_Files_LineLengthSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineLengthSniff.php', + 'Generic_Sniffs_Files_LowercasedFilenameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LowercasedFilenameSniff.php', + 'Generic_Sniffs_Files_OneClassPerFileSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneClassPerFileSniff.php', + 'Generic_Sniffs_Files_OneInterfacePerFileSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneInterfacePerFileSniff.php', + 'Generic_Sniffs_Files_OneTraitPerFileSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/OneTraitPerFileSniff.php', + 'Generic_Sniffs_Formatting_DisallowMultipleStatementsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/DisallowMultipleStatementsSniff.php', + 'Generic_Sniffs_Formatting_MultipleStatementAlignmentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php', + 'Generic_Sniffs_Formatting_NoSpaceAfterCastSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php', + 'Generic_Sniffs_Formatting_SpaceAfterCastSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php', + 'Generic_Sniffs_Formatting_SpaceAfterNotSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php', + 'Generic_Sniffs_Functions_CallTimePassByReferenceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php', + 'Generic_Sniffs_Functions_FunctionCallArgumentSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/FunctionCallArgumentSpacingSniff.php', + 'Generic_Sniffs_Functions_OpeningFunctionBraceBsdAllmanSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceBsdAllmanSniff.php', + 'Generic_Sniffs_Functions_OpeningFunctionBraceKernighanRitchieSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php', + 'Generic_Sniffs_Metrics_CyclomaticComplexitySniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Metrics/CyclomaticComplexitySniff.php', + 'Generic_Sniffs_Metrics_NestingLevelSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Metrics/NestingLevelSniff.php', + 'Generic_Sniffs_NamingConventions_CamelCapsFunctionNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/CamelCapsFunctionNameSniff.php', + 'Generic_Sniffs_NamingConventions_ConstructorNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/ConstructorNameSniff.php', + 'Generic_Sniffs_NamingConventions_UpperCaseConstantNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/NamingConventions/UpperCaseConstantNameSniff.php', + 'Generic_Sniffs_PHP_CharacterBeforePHPOpeningTagSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/CharacterBeforePHPOpeningTagSniff.php', + 'Generic_Sniffs_PHP_ClosingPHPTagSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/ClosingPHPTagSniff.php', + 'Generic_Sniffs_PHP_DeprecatedFunctionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/DeprecatedFunctionsSniff.php', + 'Generic_Sniffs_PHP_DisallowShortOpenTagSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/DisallowShortOpenTagSniff.php', + 'Generic_Sniffs_PHP_ForbiddenFunctionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/ForbiddenFunctionsSniff.php', + 'Generic_Sniffs_PHP_LowerCaseConstantSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/LowerCaseConstantSniff.php', + 'Generic_Sniffs_PHP_LowerCaseKeywordSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/LowerCaseKeywordSniff.php', + 'Generic_Sniffs_PHP_NoSilencedErrorsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/NoSilencedErrorsSniff.php', + 'Generic_Sniffs_PHP_SAPIUsageSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SAPIUsageSniff.php', + 'Generic_Sniffs_PHP_SyntaxSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SyntaxSniff.php', + 'Generic_Sniffs_PHP_UpperCaseConstantSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/UpperCaseConstantSniff.php', + 'Generic_Sniffs_Strings_UnnecessaryStringConcatSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Strings/UnnecessaryStringConcatSniff.php', + 'Generic_Sniffs_VersionControl_SubversionPropertiesSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/VersionControl/SubversionPropertiesSniff.php', + 'Generic_Sniffs_WhiteSpace_DisallowSpaceIndentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php', + 'Generic_Sniffs_WhiteSpace_DisallowTabIndentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php', + 'Generic_Sniffs_WhiteSpace_ScopeIndentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php', + 'MySource_Sniffs_CSS_BrowserSpecificStylesSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/CSS/BrowserSpecificStylesSniff.php', + 'MySource_Sniffs_Channels_DisallowSelfActionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/DisallowSelfActionsSniff.php', + 'MySource_Sniffs_Channels_IncludeOwnSystemSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/IncludeOwnSystemSniff.php', + 'MySource_Sniffs_Channels_IncludeSystemSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/IncludeSystemSniff.php', + 'MySource_Sniffs_Channels_UnusedSystemSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Channels/UnusedSystemSniff.php', + 'MySource_Sniffs_Commenting_FunctionCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Commenting/FunctionCommentSniff.php', + 'MySource_Sniffs_Debug_DebugCodeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Debug/DebugCodeSniff.php', + 'MySource_Sniffs_Debug_FirebugConsoleSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Debug/FirebugConsoleSniff.php', + 'MySource_Sniffs_Objects_AssignThisSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/AssignThisSniff.php', + 'MySource_Sniffs_Objects_CreateWidgetTypeCallbackSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/CreateWidgetTypeCallbackSniff.php', + 'MySource_Sniffs_Objects_DisallowNewWidgetSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Objects/DisallowNewWidgetSniff.php', + 'MySource_Sniffs_PHP_AjaxNullComparisonSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/AjaxNullComparisonSniff.php', + 'MySource_Sniffs_PHP_EvalObjectFactorySniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/EvalObjectFactorySniff.php', + 'MySource_Sniffs_PHP_GetRequestDataSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/GetRequestDataSniff.php', + 'MySource_Sniffs_PHP_ReturnFunctionValueSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/PHP/ReturnFunctionValueSniff.php', + 'MySource_Sniffs_Strings_JoinStringsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/MySource/Sniffs/Strings/JoinStringsSniff.php', + 'PEAR_Sniffs_Classes_ClassDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Classes/ClassDeclarationSniff.php', + 'PEAR_Sniffs_Commenting_ClassCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php', + 'PEAR_Sniffs_Commenting_FileCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php', + 'PEAR_Sniffs_Commenting_FunctionCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FunctionCommentSniff.php', + 'PEAR_Sniffs_Commenting_InlineCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/InlineCommentSniff.php', + 'PEAR_Sniffs_ControlStructures_ControlSignatureSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php', + 'PEAR_Sniffs_ControlStructures_MultiLineConditionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php', + 'PEAR_Sniffs_Files_IncludingFileSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Files/IncludingFileSniff.php', + 'PEAR_Sniffs_Formatting_MultiLineAssignmentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Formatting/MultiLineAssignmentSniff.php', + 'PEAR_Sniffs_Functions_FunctionCallSignatureSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php', + 'PEAR_Sniffs_Functions_FunctionDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php', + 'PEAR_Sniffs_Functions_ValidDefaultValueSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/ValidDefaultValueSniff.php', + 'PEAR_Sniffs_NamingConventions_ValidClassNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidClassNameSniff.php', + 'PEAR_Sniffs_NamingConventions_ValidFunctionNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidFunctionNameSniff.php', + 'PEAR_Sniffs_NamingConventions_ValidVariableNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/NamingConventions/ValidVariableNameSniff.php', + 'PEAR_Sniffs_WhiteSpace_ObjectOperatorIndentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ObjectOperatorIndentSniff.php', + 'PEAR_Sniffs_WhiteSpace_ScopeClosingBraceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php', + 'PEAR_Sniffs_WhiteSpace_ScopeIndentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php', + 'PHPUnit_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php', + 'PHPUnit_Extensions_GroupTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php', + 'PHPUnit_Extensions_PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestCase.php', + 'PHPUnit_Extensions_PhptTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php', + 'PHPUnit_Extensions_RepeatedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/RepeatedTest.php', + 'PHPUnit_Extensions_TestDecorator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TestDecorator.php', + 'PHPUnit_Extensions_TicketListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TicketListener.php', + 'PHPUnit_Framework_Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php', + 'PHPUnit_Framework_AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', + 'PHPUnit_Framework_BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/BaseTestListener.php', + 'PHPUnit_Framework_CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', + 'PHPUnit_Framework_Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint.php', + 'PHPUnit_Framework_Constraint_And' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/And.php', + 'PHPUnit_Framework_Constraint_ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', + 'PHPUnit_Framework_Constraint_ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', + 'PHPUnit_Framework_Constraint_Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', + 'PHPUnit_Framework_Constraint_Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', + 'PHPUnit_Framework_Constraint_ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', + 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', + 'PHPUnit_Framework_Constraint_Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', + 'PHPUnit_Framework_Constraint_Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php', + 'PHPUnit_Framework_Constraint_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', + 'PHPUnit_Framework_Constraint_ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', + 'PHPUnit_Framework_Constraint_ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', + 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php', + 'PHPUnit_Framework_Constraint_FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', + 'PHPUnit_Framework_Constraint_GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', + 'PHPUnit_Framework_Constraint_IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', + 'PHPUnit_Framework_Constraint_IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', + 'PHPUnit_Framework_Constraint_IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', + 'PHPUnit_Framework_Constraint_IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', + 'PHPUnit_Framework_Constraint_IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', + 'PHPUnit_Framework_Constraint_IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', + 'PHPUnit_Framework_Constraint_IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', + 'PHPUnit_Framework_Constraint_IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', + 'PHPUnit_Framework_Constraint_IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', + 'PHPUnit_Framework_Constraint_IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', + 'PHPUnit_Framework_Constraint_JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', + 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php', + 'PHPUnit_Framework_Constraint_LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', + 'PHPUnit_Framework_Constraint_Not' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Not.php', + 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', + 'PHPUnit_Framework_Constraint_Or' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Or.php', + 'PHPUnit_Framework_Constraint_PCREMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php', + 'PHPUnit_Framework_Constraint_SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', + 'PHPUnit_Framework_Constraint_StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', + 'PHPUnit_Framework_Constraint_StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', + 'PHPUnit_Framework_Constraint_StringMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php', + 'PHPUnit_Framework_Constraint_StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', + 'PHPUnit_Framework_Constraint_TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', + 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', + 'PHPUnit_Framework_Constraint_Xor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Xor.php', + 'PHPUnit_Framework_Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error.php', + 'PHPUnit_Framework_Error_Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', + 'PHPUnit_Framework_Error_Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php', + 'PHPUnit_Framework_Error_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php', + 'PHPUnit_Framework_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception.php', + 'PHPUnit_Framework_ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', + 'PHPUnit_Framework_ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php', + 'PHPUnit_Framework_IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php', + 'PHPUnit_Framework_IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', + 'PHPUnit_Framework_IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', + 'PHPUnit_Framework_InvalidCoversTargetError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetError.php', + 'PHPUnit_Framework_InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', + 'PHPUnit_Framework_MockObject_BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit_Framework_MockObject_Builder_Identity' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit_Framework_MockObject_Builder_Match' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit_Framework_MockObject_Builder_Namespace' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php', + 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit_Framework_MockObject_Builder_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit_Framework_MockObject_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit_Framework_MockObject_Generator' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php', + 'PHPUnit_Framework_MockObject_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php', + 'PHPUnit_Framework_MockObject_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php', + 'PHPUnit_Framework_MockObject_Invocation_Object' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php', + 'PHPUnit_Framework_MockObject_Invocation_Static' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php', + 'PHPUnit_Framework_MockObject_Invokable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php', + 'PHPUnit_Framework_MockObject_Matcher' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php', + 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php', + 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php', + 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php', + 'PHPUnit_Framework_MockObject_Matcher_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php', + 'PHPUnit_Framework_MockObject_Matcher_MethodName' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php', + 'PHPUnit_Framework_MockObject_Matcher_Parameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php', + 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php', + 'PHPUnit_Framework_MockObject_MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php', + 'PHPUnit_Framework_MockObject_RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit_Framework_MockObject_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php', + 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit_Framework_MockObject_Stub_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php', + 'PHPUnit_Framework_MockObject_Stub_Return' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit_Framework_MockObject_Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php', + 'PHPUnit_Framework_OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php', + 'PHPUnit_Framework_RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php', + 'PHPUnit_Framework_RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php', + 'PHPUnit_Framework_SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php', + 'PHPUnit_Framework_SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php', + 'PHPUnit_Framework_SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', + 'PHPUnit_Framework_SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestError.php', + 'PHPUnit_Framework_SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php', + 'PHPUnit_Framework_SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SyntheticError.php', + 'PHPUnit_Framework_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php', + 'PHPUnit_Framework_TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php', + 'PHPUnit_Framework_TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php', + 'PHPUnit_Framework_TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php', + 'PHPUnit_Framework_TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php', + 'PHPUnit_Framework_TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php', + 'PHPUnit_Framework_TestSuite_DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php', + 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', + 'PHPUnit_Framework_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php', + 'PHPUnit_Runner_BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', + 'PHPUnit_Runner_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php', + 'PHPUnit_Runner_Filter_Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php', + 'PHPUnit_Runner_Filter_GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group.php', + 'PHPUnit_Runner_Filter_Group_Exclude' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php', + 'PHPUnit_Runner_Filter_Group_Include' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php', + 'PHPUnit_Runner_Filter_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Test.php', + 'PHPUnit_Runner_StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit_Runner_TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit_Runner_Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php', + 'PHPUnit_TextUI_Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php', + 'PHPUnit_TextUI_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', + 'PHPUnit_TextUI_TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php', + 'PHPUnit_Util_Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php', + 'PHPUnit_Util_Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php', + 'PHPUnit_Util_ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php', + 'PHPUnit_Util_Fileloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.php', + 'PHPUnit_Util_Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php', + 'PHPUnit_Util_Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php', + 'PHPUnit_Util_Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php', + 'PHPUnit_Util_GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php', + 'PHPUnit_Util_InvalidArgumentHelper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php', + 'PHPUnit_Util_Log_JSON' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JSON.php', + 'PHPUnit_Util_Log_JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php', + 'PHPUnit_Util_Log_TAP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TAP.php', + 'PHPUnit_Util_PHP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP.php', + 'PHPUnit_Util_PHP_Default' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Default.php', + 'PHPUnit_Util_PHP_Windows' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Windows.php', + 'PHPUnit_Util_Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php', + 'PHPUnit_Util_Regex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Regex.php', + 'PHPUnit_Util_String' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/String.php', + 'PHPUnit_Util_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit_Util_TestDox_NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', + 'PHPUnit_Util_TestDox_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php', + 'PHPUnit_Util_TestDox_ResultPrinter_Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php', + 'PHPUnit_Util_TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestSuiteIterator.php', + 'PHPUnit_Util_Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php', + 'PHPUnit_Util_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XML.php', + 'PHP_CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'PHP_CodeCoverage_Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver.php', + 'PHP_CodeCoverage_Driver_HHVM' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php', + 'PHP_CodeCoverage_Driver_PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php', + 'PHP_CodeCoverage_Driver_Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php', + 'PHP_CodeCoverage_Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Exception.php', + 'PHP_CodeCoverage_Exception_UnintentionallyCoveredCode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php', + 'PHP_CodeCoverage_Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Filter.php', + 'PHP_CodeCoverage_Report_Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php', + 'PHP_CodeCoverage_Report_Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php', + 'PHP_CodeCoverage_Report_Factory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php', + 'PHP_CodeCoverage_Report_HTML' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php', + 'PHP_CodeCoverage_Report_HTML_Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php', + 'PHP_CodeCoverage_Report_Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node.php', + 'PHP_CodeCoverage_Report_Node_Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Directory.php', + 'PHP_CodeCoverage_Report_Node_File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/File.php', + 'PHP_CodeCoverage_Report_Node_Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Iterator.php', + 'PHP_CodeCoverage_Report_PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/PHP.php', + 'PHP_CodeCoverage_Report_Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Text.php', + 'PHP_CodeCoverage_Report_XML' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML.php', + 'PHP_CodeCoverage_Report_XML_Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Directory.php', + 'PHP_CodeCoverage_Report_XML_File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File.php', + 'PHP_CodeCoverage_Report_XML_File_Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Coverage.php', + 'PHP_CodeCoverage_Report_XML_File_Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Method.php', + 'PHP_CodeCoverage_Report_XML_File_Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Report.php', + 'PHP_CodeCoverage_Report_XML_File_Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Unit.php', + 'PHP_CodeCoverage_Report_XML_Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Node.php', + 'PHP_CodeCoverage_Report_XML_Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Project.php', + 'PHP_CodeCoverage_Report_XML_Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Tests.php', + 'PHP_CodeCoverage_Report_XML_Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Totals.php', + 'PHP_CodeCoverage_Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Util.php', + 'PHP_CodeCoverage_Util_InvalidArgumentHelper' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Util/InvalidArgumentHelper.php', + 'PHP_CodeSniffer' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer.php', + 'PHP_CodeSniffer_CLI' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/CLI.php', + 'PHP_CodeSniffer_DocGenerators_Generator' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Generator.php', + 'PHP_CodeSniffer_DocGenerators_HTML' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/HTML.php', + 'PHP_CodeSniffer_DocGenerators_Markdown' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Markdown.php', + 'PHP_CodeSniffer_DocGenerators_Text' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/DocGenerators/Text.php', + 'PHP_CodeSniffer_Exception' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Exception.php', + 'PHP_CodeSniffer_File' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/File.php', + 'PHP_CodeSniffer_Fixer' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Fixer.php', + 'PHP_CodeSniffer_Report' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Report.php', + 'PHP_CodeSniffer_Reporting' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reporting.php', + 'PHP_CodeSniffer_Reports_Cbf' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Cbf.php', + 'PHP_CodeSniffer_Reports_Checkstyle' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Checkstyle.php', + 'PHP_CodeSniffer_Reports_Csv' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Csv.php', + 'PHP_CodeSniffer_Reports_Diff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Diff.php', + 'PHP_CodeSniffer_Reports_Emacs' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Emacs.php', + 'PHP_CodeSniffer_Reports_Full' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Full.php', + 'PHP_CodeSniffer_Reports_Gitblame' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Gitblame.php', + 'PHP_CodeSniffer_Reports_Hgblame' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Hgblame.php', + 'PHP_CodeSniffer_Reports_Info' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Info.php', + 'PHP_CodeSniffer_Reports_Json' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Json.php', + 'PHP_CodeSniffer_Reports_Junit' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Junit.php', + 'PHP_CodeSniffer_Reports_Notifysend' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Notifysend.php', + 'PHP_CodeSniffer_Reports_Source' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Source.php', + 'PHP_CodeSniffer_Reports_Summary' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Summary.php', + 'PHP_CodeSniffer_Reports_Svnblame' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Svnblame.php', + 'PHP_CodeSniffer_Reports_VersionControl' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/VersionControl.php', + 'PHP_CodeSniffer_Reports_Xml' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Reports/Xml.php', + 'PHP_CodeSniffer_Sniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Sniff.php', + 'PHP_CodeSniffer_Standards_AbstractPatternSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractPatternSniff.php', + 'PHP_CodeSniffer_Standards_AbstractScopeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractScopeSniff.php', + 'PHP_CodeSniffer_Standards_AbstractVariableSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/AbstractVariableSniff.php', + 'PHP_CodeSniffer_Standards_IncorrectPatternException' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/IncorrectPatternException.php', + 'PHP_CodeSniffer_Tokenizers_CSS' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/CSS.php', + 'PHP_CodeSniffer_Tokenizers_Comment' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/Comment.php', + 'PHP_CodeSniffer_Tokenizers_JS' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/JS.php', + 'PHP_CodeSniffer_Tokenizers_PHP' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php', + 'PHP_CodeSniffer_Tokens' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Tokens.php', + 'PHP_Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php', + 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ASYNC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AWAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMPILER_HALT_OFFSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENUM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUALS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_JOIN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LAMBDA_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LAMBDA_CP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LAMBDA_OP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ONUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SHAPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php', + 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', + 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TYPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TYPELIST_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TYPELIST_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHERE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_ATTRIBUTE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_CATEGORY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_CATEGORY_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_CHILDREN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_REQUIRED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_TAG_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_TAG_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XHP_TEXT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php', + 'PSR1_Sniffs_Classes_ClassDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Classes/ClassDeclarationSniff.php', + 'PSR1_Sniffs_Files_SideEffectsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php', + 'PSR1_Sniffs_Methods_CamelCapsMethodNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Methods/CamelCapsMethodNameSniff.php', + 'PSR2_Sniffs_Classes_ClassDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php', + 'PSR2_Sniffs_Classes_PropertyDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/PropertyDeclarationSniff.php', + 'PSR2_Sniffs_ControlStructures_ControlStructureSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/ControlStructureSpacingSniff.php', + 'PSR2_Sniffs_ControlStructures_ElseIfDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/ElseIfDeclarationSniff.php', + 'PSR2_Sniffs_ControlStructures_SwitchDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php', + 'PSR2_Sniffs_Files_ClosingTagSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/ClosingTagSniff.php', + 'PSR2_Sniffs_Files_EndFileNewlineSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Files/EndFileNewlineSniff.php', + 'PSR2_Sniffs_Methods_FunctionCallSignatureSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionCallSignatureSniff.php', + 'PSR2_Sniffs_Methods_FunctionClosingBraceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php', + 'PSR2_Sniffs_Methods_MethodDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/MethodDeclarationSniff.php', + 'PSR2_Sniffs_Namespaces_NamespaceDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/NamespaceDeclarationSniff.php', + 'PSR2_Sniffs_Namespaces_UseDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php', + 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php', + 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php', + 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php', + 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php', + 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php', + 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php', + 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php', + 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php', + 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php', + 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php', + 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php', + 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php', + 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php', + 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php', + 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php', + 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php', + 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php', + 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php', + 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php', + 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php', + 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php', + 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php', + 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/Exception.php', + 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php', + 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/RuntimeException.php', + 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php', + 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php', + 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php', + 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php', + 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php', + 'Squiz_Sniffs_Arrays_ArrayBracketSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php', + 'Squiz_Sniffs_Arrays_ArrayDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php', + 'Squiz_Sniffs_CSS_ClassDefinitionClosingBraceSpaceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionClosingBraceSpaceSniff.php', + 'Squiz_Sniffs_CSS_ClassDefinitionNameSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php', + 'Squiz_Sniffs_CSS_ClassDefinitionOpeningBraceSpaceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php', + 'Squiz_Sniffs_CSS_ColonSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ColonSpacingSniff.php', + 'Squiz_Sniffs_CSS_ColourDefinitionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ColourDefinitionSniff.php', + 'Squiz_Sniffs_CSS_DisallowMultipleStyleDefinitionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DisallowMultipleStyleDefinitionsSniff.php', + 'Squiz_Sniffs_CSS_DuplicateClassDefinitionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DuplicateClassDefinitionSniff.php', + 'Squiz_Sniffs_CSS_DuplicateStyleDefinitionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/DuplicateStyleDefinitionSniff.php', + 'Squiz_Sniffs_CSS_EmptyClassDefinitionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/EmptyClassDefinitionSniff.php', + 'Squiz_Sniffs_CSS_EmptyStyleDefinitionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/EmptyStyleDefinitionSniff.php', + 'Squiz_Sniffs_CSS_ForbiddenStylesSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ForbiddenStylesSniff.php', + 'Squiz_Sniffs_CSS_IndentationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/IndentationSniff.php', + 'Squiz_Sniffs_CSS_LowercaseStyleDefinitionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/LowercaseStyleDefinitionSniff.php', + 'Squiz_Sniffs_CSS_MissingColonSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/MissingColonSniff.php', + 'Squiz_Sniffs_CSS_NamedColoursSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/NamedColoursSniff.php', + 'Squiz_Sniffs_CSS_OpacitySniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/OpacitySniff.php', + 'Squiz_Sniffs_CSS_SemicolonSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/SemicolonSpacingSniff.php', + 'Squiz_Sniffs_CSS_ShorthandSizeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ShorthandSizeSniff.php', + 'Squiz_Sniffs_Classes_ClassDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ClassDeclarationSniff.php', + 'Squiz_Sniffs_Classes_ClassFileNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ClassFileNameSniff.php', + 'Squiz_Sniffs_Classes_DuplicatePropertySniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/DuplicatePropertySniff.php', + 'Squiz_Sniffs_Classes_LowercaseClassKeywordsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/LowercaseClassKeywordsSniff.php', + 'Squiz_Sniffs_Classes_SelfMemberReferenceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/SelfMemberReferenceSniff.php', + 'Squiz_Sniffs_Classes_ValidClassNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Classes/ValidClassNameSniff.php', + 'Squiz_Sniffs_Commenting_BlockCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php', + 'Squiz_Sniffs_Commenting_ClassCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php', + 'Squiz_Sniffs_Commenting_ClosingDeclarationCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClosingDeclarationCommentSniff.php', + 'Squiz_Sniffs_Commenting_DocCommentAlignmentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/DocCommentAlignmentSniff.php', + 'Squiz_Sniffs_Commenting_EmptyCatchCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/EmptyCatchCommentSniff.php', + 'Squiz_Sniffs_Commenting_FileCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php', + 'Squiz_Sniffs_Commenting_FunctionCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php', + 'Squiz_Sniffs_Commenting_FunctionCommentThrowTagSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php', + 'Squiz_Sniffs_Commenting_InlineCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php', + 'Squiz_Sniffs_Commenting_LongConditionClosingCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/LongConditionClosingCommentSniff.php', + 'Squiz_Sniffs_Commenting_PostStatementCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/PostStatementCommentSniff.php', + 'Squiz_Sniffs_Commenting_VariableCommentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/VariableCommentSniff.php', + 'Squiz_Sniffs_ControlStructures_ControlSignatureSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ControlSignatureSniff.php', + 'Squiz_Sniffs_ControlStructures_ElseIfDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ElseIfDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_ForEachLoopDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_ForLoopDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_InlineIfDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_LowercaseDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/LowercaseDeclarationSniff.php', + 'Squiz_Sniffs_ControlStructures_SwitchDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/SwitchDeclarationSniff.php', + 'Squiz_Sniffs_Debug_JSLintSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Debug/JSLintSniff.php', + 'Squiz_Sniffs_Debug_JavaScriptLintSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Debug/JavaScriptLintSniff.php', + 'Squiz_Sniffs_Files_FileExtensionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Files/FileExtensionSniff.php', + 'Squiz_Sniffs_Formatting_OperatorBracketSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Formatting/OperatorBracketSniff.php', + 'Squiz_Sniffs_Functions_FunctionDeclarationArgumentSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php', + 'Squiz_Sniffs_Functions_FunctionDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationSniff.php', + 'Squiz_Sniffs_Functions_FunctionDuplicateArgumentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDuplicateArgumentSniff.php', + 'Squiz_Sniffs_Functions_GlobalFunctionSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/GlobalFunctionSniff.php', + 'Squiz_Sniffs_Functions_LowercaseFunctionKeywordsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/LowercaseFunctionKeywordsSniff.php', + 'Squiz_Sniffs_Functions_MultiLineFunctionDeclarationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php', + 'Squiz_Sniffs_NamingConventions_ValidFunctionNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidFunctionNameSniff.php', + 'Squiz_Sniffs_NamingConventions_ValidVariableNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/NamingConventions/ValidVariableNameSniff.php', + 'Squiz_Sniffs_Objects_DisallowObjectStringIndexSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/DisallowObjectStringIndexSniff.php', + 'Squiz_Sniffs_Objects_ObjectInstantiationSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/ObjectInstantiationSniff.php', + 'Squiz_Sniffs_Objects_ObjectMemberCommaSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Objects/ObjectMemberCommaSniff.php', + 'Squiz_Sniffs_Operators_ComparisonOperatorUsageSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php', + 'Squiz_Sniffs_Operators_IncrementDecrementUsageSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/IncrementDecrementUsageSniff.php', + 'Squiz_Sniffs_Operators_ValidLogicalOperatorsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ValidLogicalOperatorsSniff.php', + 'Squiz_Sniffs_PHP_CommentedOutCodeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/CommentedOutCodeSniff.php', + 'Squiz_Sniffs_PHP_DisallowBooleanStatementSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowBooleanStatementSniff.php', + 'Squiz_Sniffs_PHP_DisallowComparisonAssignmentSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowComparisonAssignmentSniff.php', + 'Squiz_Sniffs_PHP_DisallowInlineIfSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowInlineIfSniff.php', + 'Squiz_Sniffs_PHP_DisallowMultipleAssignmentsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowMultipleAssignmentsSniff.php', + 'Squiz_Sniffs_PHP_DisallowObEndFlushSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowObEndFlushSniff.php', + 'Squiz_Sniffs_PHP_DisallowSizeFunctionsInLoopsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DisallowSizeFunctionsInLoopsSniff.php', + 'Squiz_Sniffs_PHP_DiscouragedFunctionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/DiscouragedFunctionsSniff.php', + 'Squiz_Sniffs_PHP_EmbeddedPhpSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/EmbeddedPhpSniff.php', + 'Squiz_Sniffs_PHP_EvalSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/EvalSniff.php', + 'Squiz_Sniffs_PHP_ForbiddenFunctionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/ForbiddenFunctionsSniff.php', + 'Squiz_Sniffs_PHP_GlobalKeywordSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/GlobalKeywordSniff.php', + 'Squiz_Sniffs_PHP_HeredocSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/HeredocSniff.php', + 'Squiz_Sniffs_PHP_InnerFunctionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php', + 'Squiz_Sniffs_PHP_LowercasePHPFunctionsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php', + 'Squiz_Sniffs_PHP_NonExecutableCodeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php', + 'Squiz_Sniffs_Scope_MemberVarScopeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/MemberVarScopeSniff.php', + 'Squiz_Sniffs_Scope_MethodScopeSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/MethodScopeSniff.php', + 'Squiz_Sniffs_Scope_StaticThisUsageSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Scope/StaticThisUsageSniff.php', + 'Squiz_Sniffs_Strings_ConcatenationSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/ConcatenationSpacingSniff.php', + 'Squiz_Sniffs_Strings_DoubleQuoteUsageSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/DoubleQuoteUsageSniff.php', + 'Squiz_Sniffs_Strings_EchoedStringsSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Strings/EchoedStringsSniff.php', + 'Squiz_Sniffs_WhiteSpace_CastSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/CastSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_ControlStructureSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ControlStructureSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_FunctionClosingBraceSpaceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionClosingBraceSpaceSniff.php', + 'Squiz_Sniffs_WhiteSpace_FunctionOpeningBraceSpaceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionOpeningBraceSpaceSniff.php', + 'Squiz_Sniffs_WhiteSpace_FunctionSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/FunctionSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_LanguageConstructSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/LanguageConstructSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_LogicalOperatorSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/LogicalOperatorSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_MemberVarSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_ObjectOperatorSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ObjectOperatorSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_OperatorSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_PropertyLabelSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/PropertyLabelSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_ScopeClosingBraceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ScopeClosingBraceSniff.php', + 'Squiz_Sniffs_WhiteSpace_ScopeKeywordSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/ScopeKeywordSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_SemicolonSpacingSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/SemicolonSpacingSniff.php', + 'Squiz_Sniffs_WhiteSpace_SuperfluousWhitespaceSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/SuperfluousWhitespaceSniff.php', + 'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php', + 'Zend_Sniffs_Debug_CodeAnalyzerSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/Debug/CodeAnalyzerSniff.php', + 'Zend_Sniffs_Files_ClosingTagSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/Files/ClosingTagSniff.php', + 'Zend_Sniffs_NamingConventions_ValidVariableNameSniff' => __DIR__ . '/..' . '/squizlabs/php_codesniffer/CodeSniffer/Standards/Zend/Sniffs/NamingConventions/ValidVariableNameSniff.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitb3afba8d614ff1f43cdd7aeb18613292::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitb3afba8d614ff1f43cdd7aeb18613292::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInitb3afba8d614ff1f43cdd7aeb18613292::$prefixesPsr0; + $loader->classMap = ComposerStaticInitb3afba8d614ff1f43cdd7aeb18613292::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 1c200ae4..d9367fe2 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -104,66 +104,6 @@ ], "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function." }, - { - "name": "guzzlehttp/guzzle", - "version": "5.3.0", - "version_normalized": "5.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "f3c8c22471cb55475105c14769644a49c3262b93" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f3c8c22471cb55475105c14769644a49c3262b93", - "reference": "f3c8c22471cb55475105c14769644a49c3262b93", - "shasum": "" - }, - "require": { - "guzzlehttp/ringphp": "^1.1", - "php": ">=5.4.0" - }, - "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.0", - "psr/log": "^1.0" - }, - "time": "2015-05-20 03:47:55", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "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 and framework for building RESTful web service clients", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ] - }, { "name": "sebastian/version", "version": "1.0.6", @@ -309,74 +249,6 @@ "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context" }, - { - "name": "sebastian/exporter", - "version": "1.2.1", - "version_normalized": "1.2.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "time": "2015-06-21 07:55:53", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ] - }, { "name": "sebastian/diff", "version": "1.4.1", @@ -553,121 +425,6 @@ "instantiate" ] }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "version_normalized": "2.0.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "time": "2015-02-03 12:10:50", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ] - }, - { - "name": "phpspec/prophecy", - "version": "v1.6.0", - "version_normalized": "1.6.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3c91bdf81797d725b14cb62906f9a4ce44235972", - "reference": "3c91bdf81797d725b14cb62906f9a4ce44235972", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" - }, - "time": "2016-02-15 07:46:21", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.5.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ] - }, { "name": "phpunit/php-text-template", "version": "1.2.1", @@ -769,49 +526,6 @@ "xunit" ] }, - { - "name": "phpunit/php-timer", - "version": "1.0.7", - "version_normalized": "1.0.7.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2015-06-21 08:01:12", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ] - }, { "name": "phpunit/php-token-stream", "version": "1.4.8", @@ -977,90 +691,545 @@ ] }, { - "name": "sebastian/environment", - "version": "1.3.5", - "version_normalized": "1.3.5.0", + "name": "psr/log", + "version": "1.0.0", + "version_normalized": "1.0.0.0", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf" + "url": "https://github.com/php-fig/log.git", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "reference": "dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf", - "shasum": "" + "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", + "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "shasum": "" + }, + "time": "2012-12-21 11:40:51", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Psr\\Log\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "keywords": [ + "log", + "psr", + "psr-3" + ] + }, + { + "name": "react/promise", + "version": "v2.4.1", + "version_normalized": "2.4.1.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "8025426794f1944de806618671d4fa476dc7626f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/8025426794f1944de806618671d4fa476dc7626f", + "reference": "8025426794f1944de806618671d4fa476dc7626f", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "time": "2016-05-03 17:50:52", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP" + }, + { + "name": "guzzlehttp/guzzle", + "version": "5.3.1", + "version_normalized": "5.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/70f1fa53b71c4647bf2762c09068a95f77e12fb8", + "reference": "70f1fa53b71c4647bf2762c09068a95f77e12fb8", + "shasum": "" + }, + "require": { + "guzzlehttp/ringphp": "^1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.0" + }, + "time": "2016-07-15 19:28:39", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "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 and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ] + }, + { + "name": "cloudflare/cloudflare-plugin-backend", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/cloudflare/cloudflare-plugin-backend.git", + "reference": "1c81bb1f86650d8e0a121a14633fa8a94ef1496c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cloudflare/cloudflare-plugin-backend/zipball/1c81bb1f86650d8e0a121a14633fa8a94ef1496c", + "reference": "1c81bb1f86650d8e0a121a14633fa8a94ef1496c", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~5.0", + "psr/log": "^1.0" + }, + "require-dev": { + "phpunit/phpunit": "4.8.*", + "squizlabs/php_codesniffer": "2.*" + }, + "time": "2016-08-11 23:24:15", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "CF\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "A PHP backend for CloudFlare plugins." + }, + { + "name": "symfony/yaml", + "version": "v2.8.9", + "version_normalized": "2.8.9.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "0ceab136f43ed9d3e97b3eea32a7855dc50c121d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/0ceab136f43ed9d3e97b3eea32a7855dc50c121d", + "reference": "0ceab136f43ed9d3e97b3eea32a7855dc50c121d", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "time": "2016-07-17 09:06:15", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "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 Yaml Component", + "homepage": "https://symfony.com" + }, + { + "name": "sebastian/exporter", + "version": "1.2.2", + "version_normalized": "1.2.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", + "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "~4.4" + }, + "time": "2016-06-17 09:04:28", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ] + }, + { + "name": "sebastian/environment", + "version": "1.3.7", + "version_normalized": "1.3.7.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", + "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "time": "2016-05-17 03:18:57", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ] + }, + { + "name": "phpunit/php-timer", + "version": "1.0.8", + "version_normalized": "1.0.8.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", + "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4|~5" + }, + "time": "2016-05-12 18:03:57", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ] + }, + { + "name": "webmozart/assert", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/bb2d123231c095735130cc8f6d31385a44c7b308", + "reference": "bb2d123231c095735130cc8f6d31385a44c7b308", + "shasum": "" + }, + "require": { + "php": "^5.3.3|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "time": "2016-08-09 15:02:57", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ] + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^4.6" }, - "time": "2016-02-26 18:40:46", + "time": "2015-12-27 11:43:31", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], "authors": [ { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" } ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", "keywords": [ - "Xdebug", - "environment", - "hhvm" + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" ] }, { - "name": "symfony/yaml", - "version": "v2.8.3", - "version_normalized": "2.8.3.0", + "name": "phpdocumentor/type-resolver", + "version": "0.2", + "version_normalized": "0.2.0.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "2a4ee40acb880c56f29fb1b8886e7ffe94f3b995" + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/2a4ee40acb880c56f29fb1b8886e7ffe94f3b995", - "reference": "2a4ee40acb880c56f29fb1b8886e7ffe94f3b995", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" }, - "time": "2016-02-23 07:41:20", + "time": "2016-06-10 07:14:17", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "1.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1068,30 +1237,135 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ] + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "3.1.0", + "version_normalized": "3.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd", + "reference": "9270140b940ff02e58ec577c237274e92cd40cdd", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" + }, + "time": "2016-06-10 09:48:41", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock." + }, + { + "name": "phpspec/prophecy", + "version": "v1.6.1", + "version_normalized": "1.6.1.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "58a8137754bc24b25740d4281399a4a3596058e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0", + "reference": "58a8137754bc24b25740d4281399a4a3596058e0", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "php": "^5.3|^7.0", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1", + "sebastian/recursion-context": "^1.0" + }, + "require-dev": { + "phpspec/phpspec": "^2.0" + }, + "time": "2016-06-07 08:13:47", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" } ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com" + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ] }, { "name": "phpunit/phpunit", - "version": "4.8.24", - "version_normalized": "4.8.24.0", + "version": "4.8.27", + "version_normalized": "4.8.27.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a1066c562c52900a142a0e2bbf0582994671385e" + "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1066c562c52900a142a0e2bbf0582994671385e", - "reference": "a1066c562c52900a142a0e2bbf0582994671385e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c062dddcb68e44b563f66ee319ddae2b5a322a90", + "reference": "c062dddcb68e44b563f66ee319ddae2b5a322a90", "shasum": "" }, "require": { @@ -1105,7 +1379,7 @@ "phpunit/php-code-coverage": "~2.1", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": ">=1.0.6", + "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "~2.3", "sebastian/comparator": "~1.1", "sebastian/diff": "~1.2", @@ -1118,7 +1392,7 @@ "suggest": { "phpunit/php-invoker": "~1.1" }, - "time": "2016-03-14 06:16:08", + "time": "2016-07-21 06:48:14", "bin": [ "phpunit" ], @@ -1153,68 +1427,23 @@ "xunit" ] }, - { - "name": "react/promise", - "version": "v2.2.2", - "version_normalized": "2.2.2.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "3aacad8bf10c7d83e6fa2089d413529888c2bedf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/3aacad8bf10c7d83e6fa2089d413529888c2bedf", - "reference": "3aacad8bf10c7d83e6fa2089d413529888c2bedf", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "time": "2016-02-26 19:09:02", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "React\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP" - }, { "name": "squizlabs/php_codesniffer", - "version": "2.5.1", - "version_normalized": "2.5.1.0", + "version": "2.6.2", + "version_normalized": "2.6.2.0", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8" + "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6731851d6aaf1d0d6c58feff1065227b7fda3ba8", - "reference": "6731851d6aaf1d0d6c58feff1065227b7fda3ba8", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4edb770cb853def6e60c93abb088ad5ac2010c83", + "reference": "4edb770cb853def6e60c93abb088ad5ac2010c83", "shasum": "" }, "require": { + "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", "php": ">=5.1.2" @@ -1222,7 +1451,7 @@ "require-dev": { "phpunit/phpunit": "~4.0" }, - "time": "2016-01-19 23:39:10", + "time": "2016-07-13 23:29:13", "bin": [ "scripts/phpcs", "scripts/phpcbf" @@ -1277,82 +1506,5 @@ "phpcs", "standards" ] - }, - { - "name": "psr/log", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", - "shasum": "" - }, - "time": "2012-12-21 11:40:51", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "Psr\\Log\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "keywords": [ - "log", - "psr", - "psr-3" - ] - }, - { - "name": "cloudflare/cloudflare-plugin-backend", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/cloudflare/cloudflare-plugin-backend.git", - "reference": "b5a1ab53627181318766fdc66ccb6dbfb4d1b965" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cloudflare/cloudflare-plugin-backend/zipball/b5a1ab53627181318766fdc66ccb6dbfb4d1b965", - "reference": "b5a1ab53627181318766fdc66ccb6dbfb4d1b965", - "shasum": "" - }, - "require": { - "guzzlehttp/guzzle": "~5.0", - "psr/log": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "4.8.*", - "squizlabs/php_codesniffer": "2.*" - }, - "time": "2016-06-07 20:33:13", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "CF\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "A PHP backend for CloudFlare plugins." } ] diff --git a/vendor/guzzlehttp/guzzle/.editorconfig b/vendor/guzzlehttp/guzzle/.editorconfig deleted file mode 100644 index eab48ccf..00000000 --- a/vendor/guzzlehttp/guzzle/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -# EditorConfig is awesome: http://EditorConfig.org - -# top-most EditorConfig file -root = true - -# Unix-style newlines with a newline ending for every file -# Indent with 4 spaces -[php] -end_of_line = lf -indent_style = space -indent_size = 4 diff --git a/vendor/guzzlehttp/guzzle/.gitignore b/vendor/guzzlehttp/guzzle/.gitignore deleted file mode 100644 index 83ec41e2..00000000 --- a/vendor/guzzlehttp/guzzle/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -phpunit.xml -composer.phar -composer.lock -composer-test.lock -vendor/ -build/artifacts/ -artifacts/ -docs/_build -docs/*.pyc -.idea -.DS_STORE diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md index b46278b1..7bd0a720 100644 --- a/vendor/guzzlehttp/guzzle/CHANGELOG.md +++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## 5.3.1 - 2016-07-18 + +* Address HTTP_PROXY security vulnerability, CVE-2016-5385: + https://httpoxy.org/ +* Event name fix: https://github.com/guzzle/guzzle/commit/fcae91ff31de41e312fe113ec3acbcda31b2622e +* Response header case sensitivity fix: https://github.com/guzzle/guzzle/commit/043eeadf20ee40ddc6712faee4d3957a91f2b041 + ## 5.3.0 - 2015-05-19 * Mock now supports `save_to` diff --git a/vendor/guzzlehttp/guzzle/LICENSE b/vendor/guzzlehttp/guzzle/LICENSE index 71d3b783..9af9fba6 100644 --- a/vendor/guzzlehttp/guzzle/LICENSE +++ b/vendor/guzzlehttp/guzzle/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling +Copyright (c) 2011-2015 Michael Dowling, https://github.com/mtdowling Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/guzzlehttp/guzzle/Makefile b/vendor/guzzlehttp/guzzle/Makefile deleted file mode 100644 index 69bf3273..00000000 --- a/vendor/guzzlehttp/guzzle/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -all: clean coverage docs - -start-server: - cd vendor/guzzlehttp/ringphp && make start-server - -stop-server: - cd vendor/guzzlehttp/ringphp && make stop-server - -test: start-server - vendor/bin/phpunit - $(MAKE) stop-server - -coverage: start-server - vendor/bin/phpunit --coverage-html=artifacts/coverage - $(MAKE) stop-server - -view-coverage: - open artifacts/coverage/index.html - -clean: - rm -rf artifacts/* - -docs: - cd docs && make html && cd .. - -view-docs: - open docs/_build/html/index.html - -tag: - $(if $(TAG),,$(error TAG is not defined. Pass via "make tag TAG=4.2.1")) - @echo Tagging $(TAG) - chag update $(TAG) - sed -i '' -e "s/VERSION = '.*'/VERSION = '$(TAG)'/" src/ClientInterface.php - php -l src/ClientInterface.php - git add -A - git commit -m '$(TAG) release' - chag tag - -perf: start-server - php tests/perf.php - $(MAKE) stop-server - -package: burgomaster - php build/packager.php - -burgomaster: - mkdir -p build/artifacts - curl -s https://raw.githubusercontent.com/mtdowling/Burgomaster/0.0.2/src/Burgomaster.php > build/artifacts/Burgomaster.php - -.PHONY: docs burgomaster diff --git a/vendor/guzzlehttp/guzzle/build/packager.php b/vendor/guzzlehttp/guzzle/build/packager.php deleted file mode 100644 index 724bf634..00000000 --- a/vendor/guzzlehttp/guzzle/build/packager.php +++ /dev/null @@ -1,21 +0,0 @@ -deepCopy($file, $file); -} - -// Copy each dependency to the staging directory. Copy *.php and *.pem files. -$packager->recursiveCopy('src', 'GuzzleHttp', ['php']); -$packager->recursiveCopy('vendor/react/promise/src', 'React/Promise'); -$packager->recursiveCopy('vendor/guzzlehttp/ringphp/src', 'GuzzleHttp/Ring'); -$packager->recursiveCopy('vendor/guzzlehttp/streams/src', 'GuzzleHttp/Stream'); -$packager->createAutoloader(['React/Promise/functions.php']); -$packager->createPhar(__DIR__ . '/artifacts/guzzle.phar'); -$packager->createZip(__DIR__ . '/artifacts/guzzle.zip'); diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json index 6ec7dad6..717b3be4 100644 --- a/vendor/guzzlehttp/guzzle/composer.json +++ b/vendor/guzzlehttp/guzzle/composer.json @@ -18,7 +18,6 @@ }, "require-dev": { "ext-curl": "*", - "psr/log": "^1.0", "phpunit/phpunit": "^4.0" }, "autoload": { @@ -30,10 +29,5 @@ "psr-4": { "GuzzleHttp\\Tests\\": "tests/" } - }, - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } } } diff --git a/vendor/guzzlehttp/guzzle/docs/Makefile b/vendor/guzzlehttp/guzzle/docs/Makefile deleted file mode 100644 index d92e03f9..00000000 --- a/vendor/guzzlehttp/guzzle/docs/Makefile +++ /dev/null @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = _build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Guzzle.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Guzzle.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/Guzzle" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Guzzle" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff --git a/vendor/guzzlehttp/guzzle/docs/_static/guzzle-icon.png b/vendor/guzzlehttp/guzzle/docs/_static/guzzle-icon.png deleted file mode 100644 index f1017f7e6028c14a9e0694c66a6cfbb2d546adf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 803 zcmV+;1Kj+HP)@ zosv>1reIXPlo1y){RjSw2_NWGX5O-#W+NK3tBQ_IN%bh7xZ1Yehws80|4azI;aWIJ z_%xhlcTubTO7Dbx z)F-R8gg5MzGv|t4=e_El4GCwW0m6?C;0bG4DRC^TH6-pa>y8_h*QBud6Ms>Qf{oN> z=Q($Dn|DINB{`Ea{)h&^x;i{)XQ{?Z&id71eOkRPqgl17&E%|dJIC&SCwnd zY4oUR`OVorB8A||QZjLWS~cr&OD?HEtM@^bIovNUC5An6?z`xDgJL2H2Mya@dku<1YUfi&QvS8KS8=~uOs!oaF z8OMF7-5yyh}yDkaCp7Ob8b;wv(27WLL#lglguF0fh3d(d@ zP%vrDIA~G}dL)X;YnCMSE4ZM-gfVsYTLItd3J`~_vw^k=W%C_MlG002ovPDHLkV1oLqbt3=( diff --git a/vendor/guzzlehttp/guzzle/docs/_static/logo.png b/vendor/guzzlehttp/guzzle/docs/_static/logo.png deleted file mode 100644 index 965a4ef4139180ea7d33594feba2394dfce6774a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247678 zcmb5WW3woL|(Mg6aWv=`TK0sufq`d-{kM59@!F*@2P9srH!gpS{!mKT-Z;`u~dX|C{OE-UE#F<+ZcjUa!t4 z7wtq|=KmEZTN&t1@}!IM--|wLAQO=oW-a$)ZqH&aL|tU%5w7_)b^BfKm+ZuLt{tJI zkYAsjm7kx*sIy+JigZ>_V}k;31+&}$9@f8q!!t4s{ZBG7lN9E+HY^9@E<(=c+pnhu z`xE~hM?D(*{%ZPaZf{;V9e=dWPWtAg_VF};o_9vizND3`J*VgE9xx(ON(Ka3Bu=D= zGq)yON;8ACjTNi<)Q*%UF}{whlq5G*5e)OL!EED@<|@T*mDH-$86JCzs&9DY_j4NY zWs^ZT4DKCQraikO^_41vk2+aZ@&(PpL4TR6f{kTYZ}*@Z8LW#OLGbHt~F(C zI?ud!cc^y9N%O}b@$3U|t&T0qPR3Q%@4aS^xQCUVz&ndvc za7&a5E6zF*Og=K(VrAw>jOdEw<|S5OwtC|(t-8oo3&vf`R%MbZZX-w`=PPC4LzHSY zR6JDebZPN%TCLVU?(hl+c34{?-p+vxYN#W9$Z$k)BS@DGZ5gKW;p{hj%9H=9&K?vr&a9X6dA2&f!M;D;N(@pEj$D*VB__^>an*WQz%Kqa|trML0jD;2t28YGww8`GsL7%3~e@4 z+700|R@S3m6bVj=hE7aLLtq-Dp(PCHPB^XYG*zYrtlQ^%?{lXC*V+N;NzmUWBS8zw z75&48=*UszWT5o4QPi@8*-Ga+iOrZZ5!vq2vr;0L?aIRvgr^Lx&}M)cOlBGBlq3PY zyTAF24dqR_2rkzgM0Yq;OtU51t$N?|4bQ1vog!058bH6N&Y3#+kN$T zhc`Sl4|rkRNGJ_FZSnDBVw?HeHYCcF_103U!UDu-X)=~zHX$z%rOOpcI)j=ZJF*ex zNd?qQ(rqM+TKE=eI47c+Ivz9xLv*4a1a|5*Gst_(OWg@l&dszfKCjN$c>0!j zd~=oc)RJ*8{I0FmRoEF!tXejIYh8>jNA}n69`Bxz+}R}eb&9-qZWA|HN!Etg?xVHv zTk+#BQulfE5u^}l3aljwkl|rgOJu6_Qa}Y<74M0*NVHk{2CkX=YkO*pu_g86PQ^UA6aJ^JYW%CFS8o8Us^aHBI+A&sI#PQZ*z& z6Ifl~RNFxsqNfD==V=y@IwF5w{Vx=_Xd{KQc{y5cu0RC&_%Z1M6JaY`OT2_vp>QBV zrpWk*Bs(Yc0(5?e*~amy#qp}g-XgR00`JN?U?HRq?`%iOi68k$v-k@N5Q@^UX7sS}2j!TiaFQhw_uM9oq-V=}sNL<-;{1 znG$54-jC%c>Uugi>fv3wH!?YCMc8}kHH0oISlW98juay8DN8m)HxyKtyGZ5{jQW>yREsFIX@`0qovs_}RjQQ%5mLSQw-QC5+Mp~`r zkkd@gINa8z<-bDNq# z(0ume9)8E{jHwx7d@>`=yX@b^wdLXbvqJ*&Y`?POBPO-2J3SG2W7MA_Lxm;VtD2-A zk!Hn99VY2>lrpe*2o~O%whk*Z?k?e=b2jEAacgRQ1}j@YGV7%TgWx`J3pJPG_>A>j z2Et1X0RxVjt5LRcoxm7evEN_+`4Oa${B+qWW8?1nat2(yr}@*n1`1ba%7jo1clm^z-n-`nF~57w#~!{C!wjAR-Lvykk|x{|DglX zxgl0m{mK9(6FGisiN~RTF_Kg)Zptw~o0-OioXiXw24ii`Vt9#{-pXjR5EYV#hTBv> zCFJ@CyCCuA5k%X>;zvGpd9uY3O4e4^tb`BfI!QcwUc0*v*%U_>5@T&Vf7tf<3FPs) zt;F`ebJV>KSK%~|kE=h`c|c~*Ah92rgNsezat@m)N{KgDkm*Oz4#^?gF5N@lw16%o zjDM*U^rFaU=gv3b9Hcf1y}XDKUcz}#7*V#6CY0Nj$$Z$?R`mL=Z{m1SI3%0zM4~dc zcdemPCl6*$M{buY3zjQDE}G|K&W@S#o(P(Ppq)V2x{xSnDjQM)*ps``)m zj}OAQ<(&D&YQ>(1QsGgLRwJSm_D2_;B+irAl|Hqp7ou2HNfpVL#O%dT;gqFNYtv1_ zp}yrnzq$Xh9T(bNJCCEUe+SYD?~m^wziwE}1;Q%8+OY|MjXuBdTb z2@M^0OYhe2H?=4{CXMrxbP|xHl^z4zv$my=`8u^sE3=Bk%0HJlBRC|D9j_Ce*Uu5I}?wPT=oYjrY znKFVvy&cTEzuA^Vd7SWrzV!({ycN~z;r!P8DD(uQ2wO@UFb*6Guw6U%> zwtw&QRP1vEo#_BH?L}eKdS$g0OfqUr%64Hq-7`wy8WVy*bUQNHA*-A9BE-w6|F>wL zy=a@>B z-Oml*$#|&0AI;Rbrh3FPs1g3x&5iHInpNTitCsMr`#T}6e}g<=smA-_c2_r!(w(w> z6dEP(q%2jifd`MSqgZIWl`F#5SP4z$or(74q_fk=zK{s0x~`7x!S48I&pRZ9bFcMX zCNMvGNR}_!S1>z~zO|pHbjAze_i_MDAD(PE_(B5^Ww2zqP{~Qx#{KGRSxJt;+GQ@t zZ#Co!qV;KOTNsCbtZ1^Vp1a*6pX)&uc25JUgTi8Z2 z=s`?SLp`t{_&hIgUxVLa0-UKXm@|!rEAd$#xLtcYl5Ggc1zF2^OWBTfTQDmT6{$1d z=FQZ@?=AVh7g0?H2P{M=3tr~MbZk4bJ_uu-^Yv@!!nvVlLBl^;eZ$$1|KY<`gR~=> zQ7W2rCXKF!fJ_9FyQi;;e*bM}z=lx^!GersV{ZPInc5UDMHr|p@Y$)@{O^(YEqo2# z!)sqI7B!>_NUDw!EH*vf>#ipa%-EL}ZNxDv0lTfbsyv@s`#s`V2m-`*jH1Z)-&mQn zq~xe9(H}2eK$9jA5bpgFBfq|~#=~($6OB^&D&$?OvsJx3aCg3=B)!_T(9+~GwzHzG6HTFgya_Ji4Nts@a42+HP!4357w%A5~&R50MDap z;LUW&U^euclB`du2??miw^NGT?6r~z-&(Z^1gxyGi;jyN^RfHODLTzaLROnTx8v2>1xuC? zE5z+tfcyE#?y>C*YmgRa=4!T*qT^zSO>xh+l`fE36Nqfqqf7GGKrewty!dvb2Q&7S zW!}S7SQB5*XXEm<{I~;A_PvpH>tT~V+-@ZQ`U?<|+QG{|@+zxx{ei&L^Hm4j zIfkvDnVgxhl-1ImsI!%r!8A^0qS)a!4Z@-n@d>!0&zyjpU*~+NOK+2vqb=l&Lf4&Q z9R?CDRCd;yS7Ug7B|llw${R+I`$75&8{^C0-cEi@&iKR*;T6bGn=vNNC--y}b!|m9 zc@=y!p?Ia5JtlQjR}#x@+nRsSDM0}(BD?_|!z8AvIG!&ZW{I)Yad%C~k!hVnY=nsK zO4M0A@&_(22iZomPOTqpJ}+2#@#XXq`-8GMn&?VdVJ?>*Xt#$yh2(n>Sl+EOAT2g? zwLK>%CqH{6*+oXV?kBtE>rrPMO_;`;+j+Z zW~BD5ll=HS4MKZYpCjS#q zE*cOdGNK`D#S&=bt2A05qbt?f+@k75lythn2o;aAGM@T`7kfH(1KjKA(m)m`dsR1r z32JtAwP77WQRy<5QyD*9i*(YcJU40oW#0H~nmAb{&Zou>8m|{d4GaoWAko$~!4$x) z8?m9QBWCdKKmz6Jhd`&KB$GDjnl4h{Qu;v+L+fP-idTZp(*p`Lqi5>g^%ojmV@lJ7 zcEeuFN+!s(LnUef82%vA; zA1CwuXVk1n>__uWuf9S}AxXO+`}QGx<#QUf&cMd=?$z4vBs5B4{IjJ!z4wc`78K@TK9iFtKEk!_+36)R#zn@Ke97qmAFj z!1MCH-Pm}LzZNtX1aD|ru6bfDI!a#|$z5AcYns=AwpV8nql3>8>m;BKqb|y~ixQQ1 zzh>TfN6$Ef?RU-KsRHeH^k~gy17ja;US;lH5<$%h+l)1s`cT z^MyqF3-mqtrl8>=x;AY^-cp(g_7iGi1&SzF+(!BxI`>v$?#->(gC}75NJ5CsK}r@! z>3SL4;JeeJBc!)r^XLL-+MAbTwMiv-MW_?>LQCoc{=2V6!Q|Ii+N{49Sp;oo#P`5r z0_KMq9~|}ILv{SAZWr1tqCE<*P0-^*y~wK+(a5XQ0pFGLRvEfc6z&Y(WKp!tqal z?GN#H$D(MHaavvNT@Sh1Tx#3@j55fcfqvH!ug51#f^|!F%MNqS9C3tJs*p& z{UYg~^MxlK2AGG#mA%$Po>V?Ah?q@%e`mn{nTE}3-56)&UxY~H8)t4;3tK>)eRI=R zsp=@N=rA7TDO893yAvk_Q%IQ2X1>m-x6|r3F^X7zcPiv+`7@Wig^X-t!G$N#$w*E~ zu%^ZG1||E3gdROxWc^Yb{dfXG)D;AJEQ>PD=^AFN{yR~2mqiS*!ffk>@c;v?^K!P$ z@H_vG93NJMPZ#-Dwbo_d!$dFmY7fQ$rzufhK8+8)gK(|7SiT$BWXa^!6+o z$cJDT7F`@ef@rU}^__?R3Rg%jZYBam&nfhrnRPIU+na7BKuZAW`8Qie+rIA`V)BvA zHen_){ciV6>xiv7iu6{1Z%-IWn1$8`*!aeGtvUiuI_BBQ>R+-a$u<^2RD#yx!+>5l zl8m>HP8sWkiGDj37-1cMmY-Vw^;17#s|od&t?j~JypJ&{;~9ts8g1ZT9|G^M*p?TZ zZI^+i#TDui)N3b5<0eV{(-5(D?bGxRDu@skSE%Xr-6dtPBd-C2>uBQtwk0wWJI$n< z4z*f|OuEZc=IlDn&?=JYCBkxl9{U3QOK!FS56Ik2<*MS|FQVGu!(cw?9(a_^x*Bx0 zAgqE?(WIM{mLU-Gv6gWF5&01F_j+El#>Rcz_q!{?Iupq(yit`6emL0?IHs87J)ZT> zyBmfEpCBQSynXc~4qRTocaHN$&G__Y?o4Wpwny;v&Opj+E!+sY8W`LL@aa-LkY1p? z!GZu2lF^|2EDPuC(O4prK^p-b1{4-KJ1_XPf!@|?(&yu9z6keEgJP(n!&%s?Lf0l#36yB(v)?(I&`I5Q?M$oov0 zV1zIDHU@fGDC272Wa1A$9ye6l2)F*pwRd<-^j{|1Og|8bxm1-Z)q$7cfIxiu=9i&`4yQ15FtgV758v>? z7#c<4JXY9l=fgHIn=ka3&hK~RFYw;o`6Z>8rANtiMAcvRA|&^*l)52M{fbK$aWHmj zrUSxbQfV7=3|Vq~eG6|if^-_(5Sb>%>(fGW=5NzQ{|T@DMsqj`L=dehOQqujo12JC zH7{f~q>x{9Z(lW`gb^8Xd5s1?HxEe6*PPsH9(x9C!PIm(bYOvh4n*stz8MJ3WsAfw z^xtWDOBoFdYO1c@2;u1}Nwz3HwPMrB4tfLAwet@)ddKa2YKiBPl!;9@OkHA>_>T^aRVe3>M#>-!D~S~RzI=mOml1_--Y`| z^_w*I9M??I*Lv`8*wzlo8p!;0Twh9gqPSaW1}}c8Sch>X4!?M|SmH7k*SFw;K`Dh% znD(34i#x8+qc-Ll({=bkfOY%5Ur8KBxZUWK)Dw9`Lk-9-6AkC=85R)Gf*(1DIN?*AGNZ_Xn z#p975B5C|r4N3!l)!^aBKfK5{f5Sa5lgia?F1{iS)Sf5`BObD`UV zOZJ=I3GPo@($#bU@%)^g^5m*OWb1EbRqnKm8Yo$0PSL?8<6EV;2njdx>Tdv3mbjK9 zf5q;suKiwmjz&qAn^nLOe3a9!aq>yAWAgLp;g~i`q<#fLni%DoRkuh#3J8(}BM1iP zG&q`fuGU9+%Qa7>UPeH7+HpItWZ+_2(<5y-yW~Rwv^vY^d_JlpFtc-nfX42$a}Zw! zkqm3^06n_StAfyCwnlbEBOnpqnQ2kV&71PCK$8bORt0R?d)QOYN`IG;67EMrBc#~} zlhD}Ox=Mvb4=jm_3h?6)Q4eg(a}h?np;djTz!n8NP+1_NCd(fI*jMil59~3$Z68XM zWU^#PrMbgFk2t83uDXg#3-6GKk5~jUN`g+>sFMHvTl!m*hU9dCj-pQTLu-6Mj(f(L zDcuY85-djQiya4*oBz6%a@%v9l8^3e8@TKxNLYFE54dqt$JQ%{Zue4kU5(6HZ{+F< zPGI1wi(T~UtvK7rALB}1so@HsR|f*^9f@@5mZiM3Hd_PAU`FVvgG{v^K2TnDcHp0K zb=`4hX1{bq_k~Hn&Z-ao#BbN5U-+Ie5vk4PYcu%)0EVw%6)c(FuCKmTZ{Jlo4tLTE zi)-~YQd1HBZZ%Dcqa4YdRIveuOz5C(v~i-GN94mIju5poaoM!J{ewrig|}$jde-6& z_?ZmqEZM7XO!$WI$*%8@ZO;2&B$boe&sFH17q&=Ayc?AeumXX*#Q}!V4hG`EV_*Jv z^U!YlI+^O$eQeMGs02P~03m$>gk0S5;BIQ~6`tMfEURF0!msC62+n?BA&=opUL~n+ znP~GwdA$uNV`74D+A+|m;doLi$3 zK6#1AsdZS=8+Cy2&Rt1s?KpPyRtnQKL^UCQ={hVD{MB7B4O;h_P6Kf$l~p+LFx{Lc zNFWnH0`bQ3L&Dw1l~BSK8G?fuJ#ZpA+O$`y9gDbgz2w7eGE!2F+U&Se;IHWuJRQcR zYN#XeVm***I`*QiQjm7Dpo?ei_i-}zA|f9w>m^$6+)JJatzYQN(@V9j4qsTn6Cs>r z1EKq#WXED{&|+MYM>zfC^Um&jGEv&sdUi|a=HJauiZN=NMNwzb+Izcwm~Vs#Pp57I z`T(ur9@|Y+i_3o;{W^m5n}4_vO8I>Q_d@cH_Nzz%mKC7b0o@e}-MCw+0YPo+N_|2U zrSM>oo-$)@-QLquvx&jM;{|kLYrAaR?!j@82oFiKxbXteRcaD z`;v&{;9^qJa45sLxcWjy#t;;z7T}=DY}IstM7e)(O+!Pseu_{U7yZOf_+(dUySM)c zb(eSe5Um+1)1h6GdL%bg(x5lJ=?4EG%(_qUPRQ%mKR_Y`=^Lg#k)zJes1$powLXv7 zg-GJJk5-nOT$_d1h8>1p!Y^m0N|US1>Tfn$(4G%b851^M%NEh=8Ej`@tZk&X=2o_w z)ZF~ltxRhGL>CZvJ#9Rr#f=QTx*V6$r-Z>`>@L|M%p2mM6YBLZvceN=o8O^bR&^us z_x@p?rwoD2@jeoT=*o(XhA812BmElJ%%uCUPds~?4U=vR=teFhRSv{0Ob?AU%k=eY zZB=j|x^r~!HWe@R6+@%T!b?dY^5s zW>K`+^9OV3VXCU}=}jRc-q$ug7iKOzYWP&SmDwiSgwm4Lmc#=uMyS){-H0!I!FVM_ z?%U-382eybSoI%Q8Y9~S;qF|><0{LfO8YiHnKWSIr=_KPb9FVKj~DAhkB>0d+wAm( z;WH2TjlHEPxY*a5n6Cx4Sqg9v+rk3(d2#;REZc{)GS9xHB3p6FI&b2r2Cf$w2~f5%RkscZeO|^_jeXyvuvqVRL>R0`dH=NM7 z)AgRc4~T8@8CrC4;W%R*M--)3U(HMlAN0rpO)>y#L|^TT{ppaV-8f85@~NWoG_^4-8q-mzKtU_@#&+;J^ldH~g}X z@RV{DnmxN_Y3u=eeu8mBuatADsNKB1;Ukuyc_YuLcgP<2+F8$iy#2RK_N4ZcJ8-bA zZ0cEFeRrC*zHM32=kZBDCg!jYuiO63hTZ}icXW~-82^uGud0S zuq9Hr?o_?qsnX^0+4X{*>QvajMiMZzU267s-{*)}z;ImVM|j!APJ*u!&- z#C>ZK+=bMk%&4ZU)s2%{-O$?OS39#IsC;5B_&G+bKezl#{Uw#bg?b}RTC*7FATTjK zlcclTTU`*B6kr_nX7;BEMM|eI=?#4wcV$rgi@Wf*7fei$%Qz!4f9d8QbNy={@pfU^ zzb87%^|~@J*m*hIwLoZ^H@Jg4GfSv|UW<_hj=wArp~3p$x06MC$DfRaf3w4cM zi)eFk(sJYju8JMf02pA;!av0q1YL$fF%I9w@}c!K>g7ofcD9?Cwq*!iPFx*obwSr) zyf!2MDX#4IG~^HfNuUPFzx)Ic(6!h+osmdAu6=^nS=p+e*W`iG1<>Om_3__bq`Mih z{Ur6?$GE*_h$Am9)s(YNWIM6#SQAGKNSwNe9jkW`Wst3<&R{z?C~Xu}8#D~0KV*67 z&*j4!`Eqn+u!%m$fX%p6#NgPF+B3lGmg;GpAp)dmrsI)dZkkGVp9Ku=Vfk`2JFGN2H0>C54 zajNhcz3#faaEJXoeQEJx$74NpOF`xR=0nmqj+4Z^`WjkZ5Qog@D84yX>)3$(1<-># zU~!I$pyJloG@TfgwsuZ)?k{SEfvN^IK6xEWc&LE{E`cVes} z&-s)`JmI+r4vQ9J1z_$0ezl+0I7y)Yv4(as70nXmys#2PI%DZ*kVRDJP(I}oSg7=( zT;dt+pSY-uX@XR^haiSE@L3}t0S>pSAYb_3C*>6~w)$C-bpVYeN#KUnX$ zl~1sUWAGg?`2A27?w2l|UW1|f11Fk`(AvH-;)Qp*nnz64^n?__%}vC;EkzXv#TwBQ zrUy@^^I|jd{^HaC_Su8t?d#Rl5$v?HrC9U8ktws9+z_lXp5y z_uu?tB>!6s3216Zo68rb$U=BwBwI4pOaLRt z$9&cTlNQbg?fFMrSigXWD(fgX*&tq?sJ;O#vcup4oq8S^S~lk!G*47fnR++>h19E$ zWc!#HawPij)c?ecg6;v|5VL-!8IP)j7kGfToJCrT)!{-8puGhD$);da2xRR{t(DbB-PiP7Dep>Nd%ZV?VZTJvdPmNFr`ZHSr;%Lpkda*Zjo zGUQh;Kt8iAv4UDZeAV~WjjmZ7T?~|d7HVEndyi4cQ8<@cht;^JV}SF~I@X@mXo`IVW7#$slEm zraM5lZvG@r@0$j*WFdccsEvmj@4ju}ee0V~M50#zh7WR@s0tbR_0bItH7$PTtL#(F zD@_yxDhyQmDFNo=>E z@?aEQe9v%TJBw=2V@JN>#jdWcaH#G|jO{`Z7FMS}KYv(v@u5h@h}glfJ-hvam&6=5 zl*H8UE_lU(AL5Nm>yr~jUEY`LUPk`SlR>pvZg;LMp?VHV9Jtis+l8q`t`RfRU}V zn;IxP4BbTp(={TU#HsRk=zosAqc;2_PukxLF_*36zUzvs_fmra4~kWg7Bl7#Zea8% zJ9VVoa>)f%Z(n}+LQ<3ycd3G?VJw{KO} z>_pE>Sc^nGFquK3T~&7ZY3yut0|gpPxHxIs{t$rOV9#fvS)k#fcKmr5NfB}Hj@6kL zHO}(m;rj1fOu6g4RaXH#-K4=_i1Om`wT)Slu|ivvC?nKog4ClKZgrQT%;|XAoG=+8 z=G6LPDuH11fsm}=wz~IG^yl^Q&c9vBJyxOjhBEjNCW%{=f}zNoDslYPCq~CHpX@<( zyWODp{4O7r%m-BEN=cm3XYf-+D#l6d*GlYk=#`7771uO{sJ81E+t?>|=U@tjj zBGrNK^C_W*!fK%OYa5fTqm>k_s{L+IYP$^#Jf zyo|cnRY8ynZ?WEDSJu(t`8>Liq1Z|8dNY~gnL+P7$#tw_XXZVYNb3yetjN~~sdYJo zdGhm66VK-qp4Merf(n~7sK=23T(;(Qk5ssgXa;V1bc)L4>+$qnFpxHNR-2d8PAsv& z8xd0Mmwq&1BJaMIg<>-9bF^Bye(G#CqkBB3JqD zp0?xr=>LltqQtZDyLK^q>@m9GJc>k1mUWS^%{P1p!8g*b&A+l>H^g4oe@pc5f#s#5H@I?Qz*F)Bb=nhG8($bOY$n54`ijLf>#g3-a<`g6`*3 z72(i|uteZ94g1F>ntWAt!*TgG>GHlH19l+;=}w@h#cnmpP%<&~Gi?8>(ihS9R8yAm z_qu~0Aek(>xpj3*F2BqJq1qcc@=1qp@@b^FxaP*Uw!&to3yQHjpu4wsmkeXLlOsfa zHpT}wRi~ab9F}}rfQy@)CZ4kmqLq7T|t%?D%IM`Ift@JxJp5@5Q=ONM0mx z(D|i5iVe4MZz=_GHKhK@T2T2;1lz|<7-oL6h0 zHj}H}?TgA+??PYdskWDo=eOPEN5@UYr2I^;oqA8ZupJFuRhi7M)5po}2ZQKTdX8@I z4-1L?#5PPOi?t)>@?wt_<~RGe>2=G(gO?rGRzT7g5Mm-%xx1FHxmtBI_DOGXCP%2> zKv7u2pL(f_I3+-1=1wp(jZOIP{X+^Eh{rvzN?%sy@dBX&U|JV)=u=^|lowQ8IGCyjqJ2 z8h~K}Gm$Gzg4gHinoTin?;#@Q0$@M`1AhWq7@aTeYL%&?(cX;*Ef9>FeR!-3)usyyk$xs8vH@B?R&kL8{21pRdt@sRCGWb$f!=s8lv$s-xh@3@C z4xm|dEAM)`_&+T$#|feFRY{bPVn&f`pS{ggXUN`Js{K9(qQ8W`+^9{b4d;E4_kcS< z$i+JW)jnFH(!cbC6)-j=&3<_6Ab+womV9Sz-NUOYF%v|xD;rz(>~P^oeMlw5hfpbb zraN$f+a8aZdHMN(BAXi8OJJ6BPxXZo#+2O6%}%%E`ZMQ=CCE|^7*FA(D`ADjX@b{J zmGMqwlnhYrU8nd6r>;X(Yhx-^`jJfkOg}nZUaM6GOdpnYkx0T`mxZcrorXmjb$!Y1 z64ZR!2!bppc>L(1fU6~zI&VHdEub>V4=CCE{HJi019HjRmS;T^n;)#y3ZI$AX1sul zeFyGua8Oflff)4w8U+X#{g+<(dWbWnzQS|ex-a1JKNm9BWTuGz?a1qY^TP!PivoUL zlpjpL0VMoaRS}&g-V3xT=Wh?$5BXGT2FV!5qV?-?!C3(u+ta-Bj5u^bxxKOU+Pb>1 zsD%lLm;#ocgd`Rm-!m}Nyv^X3dwXT>JV9>f0!_V zFXKDiduNb7pjrWRgfI7UIGU9wH5g~IC)$rTKR!tATibB4gEwhGO>`J+6yb|4A~G>Q za%*d-B?ANTQR9;?oGh;Ep^B9BK7iE85&PQXf!rqygd24OksNGQr9ZI4bkBW^#<5jy z@blR#V5Vuwf+#I}s&6_98kl@Z0`Yxv*&j`EB_Pm_EyX7sg-7rRK!8DfJPW}(-2S?>=xp!P%1N_2IQ3!8CB~u zw10Xl9_|`EYh9^O-zUUfXm1U?Gf%bR2N;ACjvYQ(h+_iQ06^O4tbjAn*wIB4WC5i) zWskAvh37l$=k>ogZc09~A}?Xq3qPoS#)c|H=lnRJfsjw}tQcz@9{`7tRIr1{-cQ4r#fmaX>WY zN-i%d0*syVJ|^pry0Ou+4RK!3sB6K&1nr9&wkAvyX_t|)%X{s&t#d2uoz7&0aU`j> z5}YS&8p5B|wUvH~(!Y0|)!fDj&zDa>`z)9X-RU!W@OW^|R3cKk<}=B$_a51)5~o}o z6(GBXuTrCQch4wNH);9LR|;ZS>WpP#^exJHV9495n68?_(azR|*UOjaZ z@4%ANEYCW7scO&ppHy{rx3{`bn{J#IM+MsZd}NewK$FUpvRyo4Baa?(l2|x8^^LB0 zP@&c-EPUEaeEtyVvgU9`kUQ=fm6;mL)Cs>r<K9E~?dSmR zeq99#ox;9;=eJ9cQPaF>%|AYsm9-{DhF$7bR7C4|7+H%IpX87>EEBCwS^_yeLiKM2 zAg{g1ol>&3ZugkE|Ku@sV|mI^K$vn>PLkTCIPNBc&L8O8Tjs(?{I17;Irw^RR&ae8 z=eLOE@mD*sO$_PAOAeRx3-SY@0pTOx69*2iW{Q8SA&GD4pyoKV0a1ZsvLP`Uv&ht*ip_`HVaIew?V&-|Prrzt5I07$IbK)mLQStDJ>r?eaCV?BFf zPq-Y{(+C^sj92o^Kz{9fOXd}Fiz3$=OhqV{b-DLw{=dHf{8fbS$p?EQ6F)ei%qCM_ z(q@n%?AwUz<1La9)}LtyBK;0tZ^Yu+h+^_;)xw0$X)BqzegeRSV5SB=qP3V5P%Toe z>xY=#@=Zn-JbD&)aREAykW8)W@NDHZ_x~RNVL+b0muMbJWPSr|^MJ%HdF64z>7y3z zFa;;csLhfjx9BGAGKe-uYm3cW2~w!jHP3uM$4cOBD_^HM-7k50j`iZv6efrQz|+6m0eY{8s@ zhMz*EiIMN~um3y}z@iJ~Yp0lH%>}Y7fkX<;%<9h#dcA{?!ZFrqJvc&AgI(+AS5hY{ za`afT>^2WhoS>SV;a{WdP6vv@v41gC_8nt~SBtWHdSz!Pib>>;e>Mp?zDkprjfO?Ig&KO6O%rykyZgbQcidF`k|aWTG5aCQ5I?85gHQHW6ux|6S*RVC9HZ1v zx6E%}eEB$H@^i8Yqsi?iyKPPS!^M*;d-oC|IdC**xA;o#5cs0WUjc3YFzQTwC+IEs zqG7SyP*&^L>du}Ms5%q2AgiYJ4K2Vv^>kNP;R_Ewn3k1Xvyw=+8w|)`SjtvFyX^VR zvA~(~d!KGOpDq2J66LEmHKkodEP-!#0E8&zQ>T=aj5zdDS?;GOz6f&LAN6-1T$$Ou zaYI^F*P@inv@$7hjPiA;C>4<;1x_XcJG5BQEjrlSJ9e9Sw#Y3%j?*B4jV&!bNHy=J zriqHlmKvz6Jmz^B8G^G_A9+9W>L`+oX-`EE*bnQLp{mKp5E;HAts7fW2IX#=8+v$g zrFYN#0+Mtvzqsy4gNzs5^jr^gbFAR&aRsDp~--i zfs^zBq*XtKcuD}!xd_sT|71wkU+U}MD7odd=llkfs&Nq@p4C)jQ{0C4j(IoVKIKQZ zt<7qEP055T?98aT45oX{3iI+yKl`OpT$ca6Il?;)$Jp&rcX2&E46J_ zG?;*UciFPxo9K2IBvC=PS7jtHZNh|rQg`8Wq)FmoqJiFY=9n##W4Tz2qrMh@Mzn>W z8UoFP%O+PLFmQr@_%z5S-^Cf0fKx!#V;kGtZfQI;o!Ey#3N6>A`x{!YSO_NFYb`7;PTu@Wfhc<`tvd%TmafYW$ z(u&@WjOleYN}iB(=5=J_=_S;?9O=}HpllK{j`*#9<=nv6;zD?at$;zAJjn7bdoe?ZHjoEFa>3WWrP zYw04$^N4@=Obg?mp#Qhc?chYEZRWWPN;k_yy9G7`)eJ3BSP|J+i%gySK;FBsBYr)K z_bx*aEr`-HVXUnp(m{Wo)3VQRs444QF~(1|xhWPv)%ObwBFzA4`ne!SX;N(V5X#~7 z{}bGg{1lIqKu4C88(Q`Tl#(kp8E>5$@;`x7MkDkMt^K7;R(^+P>7wCaG?L_!7V${MmXu3cpy5d?X7Xh9;Eo&8 zJNnV7;!MgVacMY|*wvG$wgll@hGG3cN6|l@OZ+w9Wxo}O0OCNqX%ES+`DjT=X6%3* zi@y#8_Js!rOOrBt2vwq|du{$%sjzr6NyjcQIGf)TJ@CUj=FfLfM95J=m6#T;pyE@l zs0dz3A+dvYuKW0Q$M%tbe`+Lf!glTNZT7&rb?Wp*m;4dDBniVX7r>D}Q6_SC5l&^~DS*UuQ)=hMV>89c%vlcb^0fZ)u1X%|34f=wvKK*J32(KQ<`lC232u_lp9# znR4I4c!@}nA!gaXfMav>B~=C8nEmih%dwXIGtQqc*|s9uCW_MgvKB)H zC^fJK=d|D-jN&tMI0;Hl&rV*%?q0bVL{mUxu$Cf4(~(51QNlg~c0di4o`q>7;Koki z_ajIN=ei3&@!8UJQ{VU~r5|!xR*_2(eh1jm^<*fzUu5phSuM2(iZ|t)>l{b@R(UvLrLV=q0csi8s^z;`MM8g25nWG)1M=`1)KVwR@&Ic18n zreSRhxjLqwLFGGkZkVV(`(O^7>aVEpv3Fm+mj_vKJ-1OoYUwc)6s!lf$L#{j+GgaWT$r8=*@Lp z5Wep2czd5#oifdP!Cp2F%kH0H&``HnJL+$9{CqiPmI5L1NuMZPtq2No^Nj(MNP~TS z4afM1Pn{U@EuGC0s0Qg>{gG!$aDqtAR(Z^L`NdVmhb=Ap6Hy_b1-0a@$QZjLT;+fC z;z?zV3$V_QId|kO$CeLBHuIq36V_@JS5IR&w34%F5iX zhK7vH?QgS4;IWsszPuW#`K!R}M&-f5v9cf@#cc5^($C=Q-AZLUt6E)MSuwk=Sgck; ziy~=kwT6}T z+RpeA@UVsj(Dm!4c0iZxXkxGgrQM06(DTPXnFJh|mERSfYilZ!)V+zp{=xVK)un9^ z!|3Afh{Souu#I*U%HMQPZAU425+=k^aL%<(AFImB)D>gm56<7uw!@j@+P!_=P{i{M z_`sVzeeJ(EzDO*{c4Wc|r!XcOuTL&KcrV2A+os+x0AX}_NLGH3v$PVAC@dBd##iLn zzSz>GO994n934jv2XBlWt#I%3=}xiN(Z7#;pMO0y5;$h%d%I0i-OO@=YQltOEz_DZ zrLb-krGR_L;IH}@&iFYBA+L!tw^CWXQg*XjvsrrnUj7E6!P5CoiP#azCa6~>Un)?a z4~lnmYxQ==nZN$sB>_b!DAT$9eeRMTGF0u+P&n}6rY3R%{`;t+`2X4a68NgBYyCZ( z>CQLv96|_Fmb+m(ReYU>ZTAu^8?XxP1 zqJT1~K?aEe0YVZo4>!5fna}^*7ZL+f+kZ*lgOKx6?#;dDoV)kh`>eh8THpHCNfqyj z7W2Wn=Mqr738Bn{G(;us(_Qh3c5dC@6VjsEjV^O(9$}A9tFC_Ab0G|#`bX~BQ!y#$ zfasHW_QHta1-bNWC+Xd)THZe3?ayI(QjS?UbIGRmcpe?bZSl>;7ma&Yu=Jn*(9oVY zC?E0LW5>u!U__N~P>J?}x$F&`VL z-A;-~e^u3Aw{8bpEEMnbWy`1bgRmT$mbMV$t66gCoZUVBOI}4q3-SHnxu^SUKj^7| zNZ9N1lwaPT>+gVBdQ!_&1j_~!QpB?d41OH|69o|EEZ5Jkj~Ukfc*^cU^550nx^eSU zAN%BZ^gR=RKjOH>Dcks*VI4Gfte_uyn7>$|XZ(yL-2-5%2pH@cn`h|~?kuBEM z9s4A3=XYyN{tl?aemL#?pPqfsBS*c<%8Cp=p zvzN5e_aNI!5oF1d{_qAd~m9Ll#4z#Il>lJX{w)Y!Iw#YkY$n~(GG~BzWJaW+3UDpuxNmev0 zO##p9Bw&4{mR-As&Rf2GxnVob4w<=!EX&+$a<7t%r5XQyBRmSOk`zbHc&!M1uC2A< z&ENcZ)qudW3S}dXlXdZ6cmEuxYv2=t`v9clGWOn8CXh2~Yj1(feEyo*PLq+5T8s;`rVz6{AUZy zYW#Q9pZ^{vg3$i&CRCy@q%m;=~z6H{ApjfMhLO`Dx29J9b-JJQIlRK%JpIcDGxAime6F{P%)@X5Nwh ziU(%r##kq;V8)c79c0tEzRwU-&|Oyti+mfm&T&zSfH*COGTdDYLT5_T#$l!E3LXPyjKI&UKxg1=Qp>tK6QG zX8c-dTlQZ6qWHHGra4t&$|sP+yH<+hOYS+kFG*i~no1gNB<0t&T>^U(p5-^+>io3JGR zCLr_sBoe&0-$#ED)7a1aVdbvb*~LF7&MvqMSlAB%dE+G;>*&A$MX?9k4c&YVQfzN# z)QfXw9I2_S9553sDfZ`Won0A4bEe1!)-H8T#j|X(D4nnuaaA3!_%u|r^RlQzOVEF9 zz_trl4Rfc6e_jc#^In?_(lKKBzu}K?>ak@RAg+-aAmGDqJNtyGMYm!@T`u5V| zCAj99o$Y>Lg}+ICY`J)T&lDM*?(H0L%NGMovS!U{Pz_&;?K60+t-bTd2M@Zd=gku^ zAg?SEL1wWXP#M2RQCV8@*hi2|(St&N6G5CEy7SIeP_TD+1B`adjGvPmJ8_ z`)tcCv?<@DaLMgW4jc+_HQ>XRAntQo?>OeO6-xK=PyPF{B~#BilG{_ix4NWy=fivL zP9D_zkkTA*RONG$OC&v=`nAk`DIOp<8VaBKiIQnKt+Er#W71}Y1`lT8Stj7#6o+to zfVM`W%|MBqCPmck=|G$TKbX;Il zBa9UpJPZPz#~sgk0UPdZ*m57Bgxi$3Dbp$P zszEvZ%AX#1H63GbfY3?O6KdH_k#`~Rp@MruU=e!NFb-GJ0e&|pDfy7=cL>nxw zzhbb|_6x=rHKoh5_sz@=?LRN~Ef)cvD;UMrWq#s)KUGw*R1oO=%jDcvk-(8wIPwGe zVNGGpK~?p90qH{1@j?kZ(Lo(@zR#fFM7H3D812}D;N=jMFS_u;88z2@YQj}lojGWc z(`igc-0~Fxko(?zljjsoR-gIyJ$b6?Oi!e(3uTFJ+tNZFUr)-eJ&)+`F=M$U{XXK75XZ-kBZ#@2DeoiZlNuypV2POs#axTh;*0+E+e<$Kxef*A#CK!IUzfm$DPN&FcN2HGEXB?K9xks7I3P^nT1j!~#B?JeuUB9q z9kYOwV!MR*f4wJTXN+1203RMfO+U(1IzFZATNV{Wk|ZlM)Za29!T~sHMYhvBq4CsEGzi&en|hcV?GXKEI}+_sJDi*#iVt@WXqXAI?$2(6=ym;HI?*8_8GZ={Uw?GZ+t#t zZihz!b6GL(ysDqBS)*{`8JffgY{UK^;%Xb1Z8p0>&y`sY2A)u{9SXYox(V&cgG$>8m-VG&k z=z~bz3A|Hl#n#wNr+&(1^}*#;#1!eWCS$V!Wq2T*9ee^1$Uno0{GcK$Q_Pl@5i>yE zsZIae-wC7T*l+TwOD>wD29;IRqcaeA*#>fqAHsu<3}g9@!l?GaK}g!aOfG9ZLi;x6 zM{_s!C7ttJ?q2Vg`S0}}`bL5$Kc5{6d<@aHi@*naZF_(07Erm!0ZqF5zAalaDcWMJ z*6!*Eh``?ec7M;r-y0mDQ*L|2Fehd)?Yt?|7w05w^Hs<8+Q5xhXt?R+CTG`igDrGb zR`b;Uh76vvuC>*QPN!xB9B95QGEv#<3%P zU0uwuZ7?$05zsZ7MRw_^v)F_ZT>8;ZR=jy6p0mB9_Z-ucz5&I%5GmTb!KwXKlN$en za?UR@=9Sp4dr=xlY`Bhb!ZQzW80t8pd97F-01%&fqtGDSHDoejc8fmVi z1edh6^?laj+IJj}F5}FZG9N(szt)+t??;~m1VTntr2E0mdka#|KMUTEpLHIpkHdF) zQl%*@zKqoe?JTYp5)rS=^MgDYaQ3w)Y$k}Gv&@Wp}x@B8Bi4e z=aP#1bHbFnK&r9`+^lbMqTb$F7~OnsHrx!HHlqN-E4E|*Hm&qq!Zjh3_OZ^opO{r% zZ(HQMmaV_&(|8$}(mGOl@)hV;4+?vpO38yMLbsC28sGiv8?mFMbkD(qK2#66IAK{! zNzGeaEoYnn|Cbs(VytGX!4j1xlMibuj}5e^|6~VArNUiXie#nt^|tn{1f~+!tTK@j z6gtd2IBa9iU(Ad1NJ&vnNP_#|l=2tPgul7|jtA9bSa{N9vBb|f9L;r-*I&5%h( zasMyLX6$E96AA1FCqr8|m-7mU=R-{4kx;1bj+4vgT`#vQc1L{riciL zB6%6bBmMsH$B=2U1OX&e)^VS9q~HTHBBbv$>E?(vLu~u~ljmL~%k)bC#SK)-PDFAd{#hWSTa-^3*`GCo4CQXU3UiN=ipTk=Bv%B@b)O`o^9qapv7Bd-4I@ zHftp=9ZnGX-R^wU{WvGyKG!hgWI31tUUT--fOE@+dJDc(Gju2y0Xu?7dZHFfCT+W z;%pV%4l_`_c(u*#AEiz6tB&gakj9M19)9)N7IFTuHjllWWfG80a(!8r_bsA(Ur(mo zE3514PwG?D^2^FS$^K89@!tg$={`-1&k+`#5ZB?&n`4-q57{R961LA@>g$jH=}`M# z;m;W2Ko~7z6=(#WcAf+e_SbCUHX=c#&0&1|pyCz%+=8OFwkPF;vclhVZGNxp=XVEW z>*rmq{Wov!NaPQ*g2}#~#sfiz+yy*za|$kpK0EnH$TnvBWa;CU&34F~H0hrCnIti< z@oeYkIv?0Rrg;DQY#K4;dj|&GudsfZyG-_I7!;89Rq(ahL^|YxmI}eMaPhfIr}WzW zAAV?G8^H27lF1{2gcaVq-QcMDMZ!pZHJlaxL5Ns?ykK1J_S)?1mWyTPUoZLW! zxMki|IsIZEbHB?y`hK|fLg2V~&ZFcdl}i^h&%N!1L*P3;b_h7y1(kXGym-r6r2GH0 zzt<6E=ilp-yjOxA{X=VC{NYo`X=vpfA;I~~)K0qy2J1yV01>7RsS2_8| z3gy+{KWNLu6*vpo4(k@VaGq}7ICWSZ!BHbTbYy*3S1_LhCU%nK{@T2w_2G7ObxpKA z?S9VbJkWH4V9?#+SnS4jGud9`Q!YUvgRfIbSsB~8W$hrQcTgsG)wg6HI$WB(Xll^{$;uAuwt;lO%d6LvlPm>OV6L_b~HJNZ(4sk;R9tO|X*l{*VAiJtc z#o~=jHqvQ2B8lqg0n(hcAZ1z)D;5Q_>92O}-`OXW^5FOQT<0M!$^v;gg@rbhuABB) zlbjEQ#)*ob7dWI|nHnqjqi$rtAyZ2zLNFD##g7^MJ0l+~jX{+x?Er z`CMw5-;@dcID{x!9_=$h1TZMi6JKBa#g7hQ7yFpz(RE=>+M5?3orY=Ls+&$Rw$n{A zBId5`T^ruAMHP7cqd$A%UC!>mM^yPD0oYN9zDt#P+Hxi3i5lYc>%0?g2Gel8W|z8o zw&HyX2FYCo6DH4jr{swVNc$Yvx94?4r3V0-V1UImAqtxTe4gDyc6Rl?yR8lM4YtN9 z*Mp&uwz`G*1V^u(t>*3j_htZyfe=*1UG}Q)BxdiLcmR>vu!CUr1kW@_a+?2 zdxObzcFK@;aD)7!JQ9fs-zT7uK2=egp^eU(fG!|*AQ7Ud!RdB2b$9m}vhin>{rV<| zizb8Tc)8<}R>iV5rmKl35F|q0;#nQ8K!rlT1cnpfXlwkc`mKPgx^OR+?)Kx>*01V#` zg}wguyu5=#!H;Bn$L@7{OQ1WID(*1IW(3fB9M^jh?t(aK;>2N^B^;TakM!1wx<|hs zu&n_(sHDtz+M%lQNfh>-A5_WtY zI4sJ`pB2Ze?fw76z$yq9xRm8hpS^_D)rN@_Duk zjx*al#3kjq$A9*{_TiSa5ZG!gc)q$i)ygXSI(E5niAd`unN>-|-qWQs3mEO+Woz=E zbX|Y4i6vjY8ScijLePJulOwKt#VVO1*|o^4pR363qXS#kAIf>xvX!<+%CK~9b7gmb zC?IznZf-VE=ucQCnFpaow-@&&Q{%we`urcWvoln92h!;>z>97$K!XPIz~Ai53GE+K zzJFyzN7>hhb$vYa=|-eUWK-g#iAOCs2y9rkFwndZl&|6vw;lUw8)h%^Fi;MC7(}M=U@Xtr{`?@|7arFMrOOo_K7&hAhzkk#=^!f% zn7`{n_2hs=zvVbC^D+KtnmF&nb9`UAE^iBXvd(%VYDC=*VgQy@R2V+VOluOTOeB_7 zI_*6X>XV*_-+enA^Rt-Amh~P7h#}1TX=uV?}Chobw18bb)w=G@_k~}D(Bw1Hvcgf*xLe3qj3z7KHQHm%H8mre-DdT ziR3w7l2z$nAWv^gQDhh5HkX5W^D_v<&A=1)29)P7ZI`SC_3J`70B_l}cQ1-vy!}{F znbl@m-=AK`v2pL_OySdLu@qLv@^#OX%v(lC>xMZq}@8JxCo`;11I-`gc~@=s0* zRzLZvf7_>c2)t*&fg&TJGoTYIP#rdm_3IC$D`wRqbL}-*=9ZkLP6xeYhoF}fcNGuC z=0sv!w(c!svNDO5R5q>MwaY6g8~*_lcoy5T6V%Zu37&M!|F(vWopokPK$RlE?z+@= zzoau~FNaHtQMiGbEyD_v6wUKXR8|bn3L1_VX0~05>e!!vL(>wFn(DvO>kB`2>-d=G zT@&;wHm+~#Gu85}x&@=WT$NCI)hkx?l#=knyfEiAi90hq&R_fEUH2FZK5|2i5)9l7 ze{eY-z5jMh=PqytAL(&TU!la`;Dq0zgbOa*)J>i}FPFqm6z|p3^F_(>j!k`fIn@mT z9eo7^JH(Mi0+IVC!JL!IcJngxMX+}5ZfeR}y`{x> zqNU|1Y&u9oD3_#M#%ZONNCXGx^k|f)=-c@pzp1FIxO@SR(A*t|>RV8j2PD?T^y`;e$1_#U6nK^LnARF4rBYR|RZ+H7Pk&q?Y!EJA$W1EZhtkUz=tXTuw?Cd&DRr%6g zu~>9{j6}C0C9&fCrBlR!^czhvqzm_?U8}-ZI4J`u3&!-9JjxHro*P$Gza$EkKx@-g zIG-1c!A!zx_nuMGGHmHXK>L}zzzlX}kquxR~gL22p9 zI2b%wac*^WwONXa4CkS^vEDj=ECKoi2H zWX-g0z(q06rrvvy;Z`XNR;&w*>LEi1LZ49Z%zW~ z4tR*X2c<$~zX+}gMY*{-Rm@d#D`Gc=kP~&8bFea<_Ey)EAx5;}auQi_|6Emepj*** zS)REK%mV`;X@5qlnUopFJ)y4CE?xmD!K0S;@PQtCKYArFuednfmgww7 zAXgQzr{Uv|%r*J)PkpBH2_R)40WRi{*iy&!L>>HIPYnjrV#G?L%9{oDyl9AokM7bC zWfF$Mfa7j=UHS|X4)&O~v1yIdBZ9!A_7Dq;?8-YW$Lw%8ogCDPCZn?%JpkqFp*lqu z{($b4O(9>gQ+T?ut58*~FQU}fdqEZ3p46SMN{Y9MPncFxmeqSLT!`7j$7Q(it^-9S zHQ5Wqvp;93%Fe3*vKIdJ826TN+4Et8Y$$QMYe{YGnDQMixWC~&;J5ah0K5C)yXglU zXm?g+R%UXiZKG8pT<65^TfBaKW^kj7ha{W4A**yB0%?oWY2!xIrgItX%jDp`y@Q%8t<@+$&}#RMdaLAbkoj44im;HfL;0UA%`W_cl~;7j zn@!0g2q5F?$|;|cgW%A2riXH`+20mBZ_%Zf&idyY{(TxFzPzV@`qLpFVs?-x9h(op z%8GRLHoAuo$D&!yy&sMQi?5EVzGYOV*r>6Nh~Gc{a#B3%sY{9Zb|L+WqnJ-;Xesq%9yonJ ztMJ$zFCLDK9~_qxC+Ldmyu^wLMX#+W4fl!Pm|8M93jF>gk4Ql(JKGPw+?dH)Jn_2G z{`aX`zQne;pK(@+{X?I{$mCR~kt@cq(C>SbGdtC#rz;vODl&mRpTz1h(dQdF6s|f+|s1Qa#NP6I-0lTiJ$!BZ4Um?K0s%C|I(_r zRN~(Cw&Pw;9QRXhST2N2GRhZ~*fhY*&Pkc(7cEWxSCXUpV1;Cz4n!CP;w7(6f5 z*@-pZEX8KInfYdTwR}a|UJIGJCFT~e8W$5#h018^BV`*G|t-gM>Ey&l;woJHFR=xmIANFjo#gS;t z)Ae=ji6h+*u(!7$*rS{76HZ(5)x#AP8Q)uvr?;a}>MH@t*Adrh5BdW6lv{;q*DVb; z9EG0@8$6FWG+`4w5H6MDeSv`!!QI2o9eXBp&T|;p-9LJ6A~U~4 zcL!{EAwAemgaiR4&Bk8241uC42+%D}Snj#&@t}+ISg_0|b3p%5%c5cb8WL2~ogigj zE$itumh0?*_3YPOQ)FkX3C8zk=Bl`EG#^(@o0c?ngw9meG}3wSdlTV5XTonD?>({x zDc%18w;uq$v?48YFuh+5r`gn=$4DxHgkCHfDBQ39|!K1(t;wX%K* zY45U&1~kGJ%8KI{HqC~nkM0YFGUnN6m#^6VrxOF4a%}IppKMz_AQZ1CJ@i0FM<66+ zX-GbPKjLmv9Gi3@G4ShDi#`r`*nse>hpOjXphz4w;k@aVOSX76xxLrUer?)<_e4r_ zVjmX4xf6rq>$|W(I`+kWDVgsB^O0YndeU-Ut0~GsVQuM|OpL(q8VkzM2|@>CTelqRC}#Q@|1@XdhR6 z{4-Hm@!dIjKL*SPwW;&%fE9U6BxVS)OjvZ$Y=Erq#FkT*y=vGqo9^$8!tWsYrAUmTz8JUps+<;}D zrw}?$a%l?;GPkUzhOJw9TbUr>qN7v^pRz*p6@>;=SQ^}Q6u;^_Z(3<-CKKW!UgtXYZ|iV z6fs-r!c%vgWjuJlvDeWn0kgA%17@fobFHm2nH*BOgFSZL{%+3P`}?wey~~#`H%gHl zv1fk=f;vtd+vOlB7O^=vA_KC4>J<{wlQUMWXIj+=2485n)_tKc5EbJeOLEC1z&?J3lA+l;L3Wzdc9b(yCjv+alWK>CsDQZmGQ z!DLvcoX>`kn$nj34J|Kg8ww|w!qotOLI4Y29>SNG6P0{u!LD5yn5mGV&uov$F4e$P zco~9ic;xMUwa46%%U0f2>QcVaB+g4_+Wv8FC}%^*`t>wrB(KjeufFy7*L-TiiI((e z7?)F4zU$Vkp@!`q(9`xGsBLXj!r=^5NAk(V7I9Z5O#bD<(#X{>9_}s@mTd)~C&Xk( z2_=V_?L9&)>$i$#Z?#<~l8Px|2sJYy4s|A@Ch-w&yA4#aXsGU3kYzMTeXI|ElLY(| z3Uv5%`!Gqz$spE0@uFZ(&LP>P_ib6VDw8QGzOSzEsT@@@QJ6JR;2c$?slJ2;Hvd=> zyj!G}kly$}y-y;)wLIk^lv8<#dGcn-v!8QR^+?z1)uUed2I?F0Ci0GJ&iU6Hs{nL> zkqZ)s+FCvAut)GL|G;#-m~GSMw2^*v;e>*&M~?z_zjm-qt2ThkFOu~55-{L$6k+0;K9|ab(A;Xfl0A2$kkc(z~v5?O$8zP zgo0q_U?5glM}3BLE;dPd%p?1D>kXM$gC(=^2n;dVfyIU63T(IM=7k%w5r2?aV7V;W z*QQ+d0W)P!sjOUa%Fo2`HlB{}m8?Pqe)NwRDLyHD(H2$EJ^pk}gF2%;(x+3(7g|MvjFkam5_y-Aje?dku3 z#@k1FKe?f?vAv>D`%s~*L>$5nd8D^NH?*Av6YVG!M5HK> zDc@5Vq%-l-J65bPU++ph#$>jPINqJKsPwLF4ZSZmne93fd4}9jm@gC=ZhY1ymrOAX z@@ZsYf#=(PIZ;)WaaG8ahbdfLNbpG^R1Y)k=v+!VR)Jp<7+|;8Axg^eOy5CYJ+1kx zj1Xs{G~a5om5c>Ls%!^5Z|9V}$#R;x|2A$)XdNW;RBcvPe;w(2%!|9t!7PTV7Er^( z68;=U9%7cegfQ9(Y5Ppi879jM(Sk<5vUC<@+lt zMmKxj?wC;lH_W_5I`x<@pnU+AXQ5}?&)#>#n(h@Vrg_CapAm~_EwfZLA+p|vPmorh z(hK0oUdM1XR0}C0j9m%!yaXA7a1YThce|;ziA1}kTKt24E`QFY(!T(Zaxs$wi_)Q7 z_vyX68*7T;kvw)B?oXDXvho#<SNN={S4k*i|LN##d}}ffB|0N zh?LM|Li%Sw&*u9Tsa0m~vsoqCb+DkVhIo1b_#NIuJSmsRZheFWe_s$J!uK@tjUDmc zkKJ&jC9p4+oMk)SU3k#n1=1xQK+*w_`le827rRpUtB9w7Hzb6~9JQIZS)%mwQzQNz zXotJ8ErD&VHOr^@{CXm>b5VKjYY*>jE-VfDg0>}@DoJZ;)t8o0Op+V!-e=3Q>S14v zYU7-2?zy8L?PFys?@PPVhZT)oXDWfKfu~xTO1tmZxfiZpeY}tJ3=`Gg)LfUEw!)=66eaab zs`PL&os>Fl>sHm$uQ;crqvrngjar8AN^B8MatQ90bF+OduRrtnK^Si@V;_;^E=x6; z^*W)UOHrHY6L9^MV0!^*ud^ST{2?$C-i_Vxn=a$GRLv_c!i_WcKDRX73n<~Y!2$dy zBw%52^{&Fe?NI&Rcl))=q^qS>R60J%JQ(}v?2!Pk@6$^h!<+`V(@dnR zm7AuMErFN?i53Te2Yx-Mxx3cw4B96=c~SG{qhpuk%t;O5nv&ARJc+WKO2|%|$K9{rh zP51t!<$@dk?R>?SSdX5#Q&ssd!QTwJS$mu8NGZa-QXmHt`+5!>5e#Z);$v{i%J-$F z&Ppcx-p4uB?PPj)*7&?_0)8Td@p8w&)u1M;CbIf~7whXIKJ8Mhk|ny|y?YrP`)iR+ zqq*97ro)!FmYKlH_`GTL?vbV3xw@Ht{jy0#nE>3GDA=(!|6?Qo{s4u=;~}KG2EbD$ zIbqfHVzFdaVPU)i=!X-3bzM{Mg{sC6m;(be(UI!B;=IZ6jUD~t^@Noz+iId$)+hKV zNqC%239--%FWmPZ2L=_(iT4^!f7b)&TMc}!=+k2jovUn04yYdNSLXGhXjeWgqFEAk zy16Yqo|K&KlFq|jNIF3_> zlZI4)0N+QcW~>-6NYLl;FC)VaYp$=|ySEjiBOgc{4?U0frD`8t%uH%G3 zo^HVzGvt?bTnbh*HyDwDI?MCfAgczuH4-e2F|%G&Pyl`n4}~?Itte|!hZXNaMaj8Q zQR#c4QGa;V2{4y4Nw8yW{l`c^EbLQ4p&q0eH_gb89GtCbjdKbMyDCnicts0P{(RfI z{7B;k;FcANSA3>XDI5+-cXYa*}48L zzqacB-e zoX!D+7Re-&C|HQh0?sao)QJt4Fvy zi}w3X-%F{K^ipe|RVp*dfHL0En&>$IQwhv*gj%V%RggP=rorfB5Mk^lwFHLiQ5VFZ ztojRseU@!Mi6jahPnjQBAB#oK%@1_PQmJ3U==v3sGq&q#{fCL9srj?D+X?aC8&=d` z=5+L|6h%D;?;~EZ0(!Pdo`J9UAuw$1MB4K0R*vjPYQV*)1$hqwc)6-VmO+6{P*@-n zM;dS73Ry67iHa9q(wGqBq3gnoUXKKUS}ivhRJOzKIQrfz%!+WT zOmkgxR`{HAGD$1K_j=i+Q1{B3qHfvZFN4bLhgXcx?~737yr`-)ckAw)*6x8uWT(xv zOv9&1S+;qgbN=#w{cP262C`Z_*PhLP4%peVa9?~hV6atN+xsp;Wn4vf>94@2^XUO2 z@8wWfy;PFuwU+DU!e4(_rs@jE=)b=1C@KDs(3e+b4|K$uU*(qcSgYIrtk1M{1m&PvZ%$eHo>SqsVYL#$*ykTWKK(IQ!S?R{*@fpX&pxLx z_@+nXjrhD7iTV{%L1@Y57J`DNM~{6yO+9x1z@HJ7PG{3BDpC?3MHZZRa0bsAdp$cP zATYXD+;U6VdIX4s@)YmuTUt;xfl%@HVU)0fuFR;*Euat3UGEm`c+d9~TAr1^hfRC{ z06+jqL_t(l=?^P;*AdtLwd{KLO)H;#<)=@m6J|Kp1lQppdZGi^y`{|F=2LziPWO@G zn%(cYMjr}U9@+j%EaUSX-sX?aDeQ7zeQpodH46dBS0UYIr2XzJD2f(`WpZ9b^Q~)2 z4}2s^rO63mE>zUqc_#MtYJ5(q^i`Ld^-A1u#ZHn*hmLeG-kmC~Xso@zw3N9Z*O@@->jm621349Ag!U-M z(vwN1JQ?G^!N2hT+Tk_>j$n*P| zLr~#DCOLn6^UW+w=qhY6n!rHyd(7=%R3e$;nZt#Z>`gD=Oq;&2m&d#<>mq0KN~dQ^8s6`I^5fv*+p?pEyqJ0 zlw7?{rtzs*vOfd(S+iqVw_3Wh3US^t>SIGyFoc!nmq=KFUyRxD-y6*P1+S~i&?b&% z$sX$NOC{0<^_Z(x$fZME8N%o4_Z41gzTUa?`g`vk^qITwLG8sWClqvQw!Rq%leOD9b7RVWVW<}&#STt92`{Nu7;ZS7g|Vnci0mX>r$Wqbd} zr(AUD>_G**6jrcl^lkJU*VZq#+_P0w;VNx(1Pd4fgjIi8?Qxdi z-_z#P|C&I;m3Ye59acTFV5q;HJsnduO}m1rWaZ_TT#_$bJIDG0`pJ65RZRQo@3%Iz zR~7bJcKi{~ae7qQ_Yi2jOAGvRAQTSP#cg+z>+zgb$7(hTWXiel+jin_DBGC;3m0q5 z>i=F|UKem-Phv-0YT4RFR?=z)wb?J`owj1d zkTqNjX2gX>+TjIA&=@Z7_4QrB3`A}Cho|xTQ&zrWdjfhn_H>#q)uDcsHua?)BOST3yH3 zeAM^D-=qdIdJ z+i7F+;`MLAr$(!2>#Orpo}PG)$==5MR;?OJTyhm-FD2%WKnIY3LcILfFRahRT-G&p zj;rMPGYvEH{+qvEmVFg)WFMP8p~X&+`oy|Nb~&Du2B*X3bRs?nG@eDWAN3rPAlx_kYXm$Sw$%lOG@#Gi*`|_Z&ICIhWbO^5ohD#+dpzp>6DsUo0sqGl zJpF6oes~K-b;95X*MxAH1ap-ItZLf$6TUue|2$>oo9US%w<4e33i*AZn0^#^J%4MH)cLD0KcH8@XsRpK3Ddn`_#_uLxGvna2TB6d?pkJV5`o5 zark~~Yezp}{~b`CmjQqKLUHzy!G%aziz&O@wQM(nWQM}H;ap1!rj=ouQAd)eMHDiJ zNfvL2JEg*4mXY2F3d$!C%dvx+v}K^f=n&tZFh#vo!g>mI=^vE1`|(sq z;&xS%uK`iMjo)j^D?O?+M36n`(`rybxf=d>AC*0DYmpe@MLi-R<1Zbhhr6cDD6W_Q z*HUdz)}{2!Iqp*!+Qd9 zTY0YEXivK)$^@ZMvAa%7yXzLsojL?xT(f^a&GzT|VE%UJYDy=S6>aNN|I>9g%ro)q z<u2wo0B`u%q?h_IwsJ4JJ(mxr&-}Y4quq z1A7-16bz;FPRk3YXXJ!ZZ|J>UazA_XgXfkG+po(DJ4 z3)nQ@`^O*nI`eCZ9Q4%l;rCsIH0LTLQLJ}u_84~53(~HYT{>;@D;3e`+cFr%Pqph# znM;%lM649PV-&a!(fxH>J1Z(GhTJMAY104sMz0G31;1OTBBr znI-R9Tmf%6l4syuI(8tXCFwB7g&%GMmC0+esrSbH{;o4Ib#SmxW3PX|1nM^(Oq-0= z$92-{*Ek-$^+Pv%=5Tku6J(!g(h4pC$Lytep!L446w3p*FHXuV>P_8;lYmrJ`4#N| zc3XmXWatpVCU6YQLSXoxbk~ImXPr-`z2#RNI&l=f3C>xb?I`4`fwJmzi*h43*_3|= z5w-<>#-B0u>XvgS#%nt0KVN~e|K>nC z^`D>t{Vy!68t}Yt`^~`{2e|Qut$J&bWxEGesYU6c+3JiL1%uz8uCITwL;pVw4#--c zY+JkF^D%-2nQW6Gg?h64q&xdd{C?k8og@91zTDGOIvB|;kI**^!W+`I5k)b*OLUJd zOw`qlxg1U=#IxWtBYO_*iKQz6tdAfOr)=A9BvT$cvNT8YJT@CuR=+BHWC3Umqgk?a z1)ni@?z4Nliv^^qL@6miy}OG}4bMkmU@IxjELzHZH4DziPPcuu*@iyhNfC~)E@o_jj|JtE3i z?B!fZslXmDLR}>rKBS?EE)?sgz1^X~D5UV~n6hib`948bQ3cgjZm(Q&DWa>CPRPz4 zFm)qhd&(pb?HojOJIfa+94f+hItgy9E&q54G>|nUVObztGL7!EWtJ_>AKFHy(gkgZ z^nM>(>ifVB&nV$(u;sg zMQw{U`A~`FAK$D0`(JpuswxrU@)KMHCy9M;BF*m#PRV^qK+1&WsxbLYuK90k?(2KA zwwBo3lwt|f?hjIL4fp8ynpqc%T8pQ0cp@l2cmtQqOC*V(3nF~{zVfa9J+YSsQbK$$ zeES!a`xVjpYS-z0(F8BT6M>uye1PAcsfb;A^BErM=~N}{`uGB(5%_}+yo^H!irN-cs&JKdzW6&2x+igiKO;>eUn$OK7J>0Dl!1)Lmu+F71*pVr~8{{k~hVeP*9ifSjL6VCkP=Td0Xk z==zR{IR|jzar0->!M0*c(ar}vP1JC!RH(EsZ$0K&?TJ4zI{&_6^5ppAd%N%T+x&cyt{p=2L~8Ft``U`RCQZ;Cd#CP7WeueM71*Ui z*6XQA3FEibH0?Gn(eZ&u&XhH48U~gx|BL+Hd|X!9xvzF58=!=HMAqBz-^LyY>Cj{; z$`HM%DFkgieUA~be0ee%cMYo-Yhj-qi41KGMYn6RvJ#YgPh*QyBXf4K>$*Mg*Z&Bd zMYpBo@Ndp33GBSArbb{jGsl*D?nyH$J>j74yvpSnxs+b`WK$CW6l2HPCV@S7tgtwD z>k5Oux`;;h7T44q_pq-9pMaevb$vAX=jyyb$GanuLs>nC>ROt+|Htvz&%AW{o=91A z3%0n&J)lC4Eac0PJgJM?=~swEHy~i#*3~uo%f=6%Lsv}B%@iqk@bKZNu4}g;LE>{* zh~8~@?sVC&eEfF}y`jPLQS)sdh}QS0l0T+$T3I`6?$wNrT*rS`)*JIp#aBhB9eYV+Uy?o?I zc74l0wjfp)LKN7;i6N^C+Xi5)ohO083>T=OlJ)D!h*;^T;~Esfqx%Xa4<5Hzz z8v#%_Ox!ap&?B~;*`dC3WzD-a==t9TkiGOc9z?r*V#WBXoSXw4!Q?{tFa<7n_}xVe zLd-KG?FG2Xrbvo^F^FT9g83AIU8w1^@ThO0GvKaS5|ow49nTq{lJqnZAZj3x(m}v#8bgJ@?wCDuF*bdFs?e{}G>Qx(}v@On#X^bf>He;y?4zsX7X`-H`Pvir)jD;!Q( z6nqAYCCb0=bJZIbUw=!vP{I>(O6S7)OBUq#jtEAylU;v0eKsP>S9Ayi)rjh`{kmsN zDs5@OpKl$%{l)jY9NYRMsOnnsqUyn}*4EUf*6s-|3w}(N!vEn0lyBrqfsb5y!)@a* zpb|Kfkyc9ER9$a%De3POAfei~?l<=C?2tfD+eLtF(kUwALC2zbg~8y^qW(gs7eEH( z4WK5hMx}&EStJsT80=qD2)G$(`m=G_UH`Hkyy+)ODreROh09icx>R<+MdG9$cd53P z7|xRh8R)=sd)%(=#A`?E-(kg8159ppROumLJ$LD869@=F+4JXTcpijN3pHbYD6$Q6cz@Pt@WG%IH72-$1lt{nk5U&rs!yl6! z`h9N6H^XXvZ}M1bvrxt_H8o|e-qLc~`h7=4cyQ|?6@{Cycl%Uo2Rdx~I66o%Z~)0a zrc&qbKRxx-KxIzpoS>$C4KSY@;d5ICApAwBKzk!moK^4t>=&!{{qc`Rny^=h>N_vt z+UGIZottcG8rlN=rGXjyd~``*M$PLC8K^-|0^bz}@71s)Wb{nKcGKtx(#2S z)Y=l)jpn0Jmg|A|=>R}Ghlm@Y~nqM7+9)$`uv&TYRK$5S%CFRrtC$ieW)ro zuV7$rb3Wv9oP7UYISDk>Wp#CY-l|o{xt0d+Cs0y#psw^J#{%N_$31atb=uZHhe|k) zp>XQ?hDWZkJ@@(RkjgBsK|9~&_hr4Wq#|_w;5|;a*AY>^na*<8r!eLRu2LVTRfyH{ zxIuZkB)c`86MpTz%a)4gs19|`V)S`5jb z)&~rqT2!XL9dq#abuMdqO{H(blxcgfUimhE?{i>Wi}38lPJn+-l0u&XPt3S{@LMh^ z$={VunLmU3p#jF*+P=2bCj7c5cpgyoI1gB5B-GN=HrZmtlrM_nwE-+ud{%{C(4S^jx)jU!8L}o;r+-sIrJJl%q(>f~!`qKB|CSx79{r zFH}hQ8qzDjfqCO0M*H2~B&p*}X$Q%6e||_AfO0ubAgV<7VO~8=h_N}9G+#1p?^(ah zlf|+Fzw+@0!*Lgml0Ss9UAwCzAQ-^*4h-b1_|(7W!_)0bQTqj;Js&fYeL;nRUC_3c zhgJ4T>hYOzV$2cDW&&BzYO+xCKzyODN$%D^+@Bf={$rsdJY*um06RY((x#x8!jN9t z*3cVv`+Ghq2b9|YAzY4%H&>#9#VRYnZbTA=+RpVDO4V;gUAJFc2EGX~Ol5iFCxQ`i z656&;CG@mKJPdX6ROgoJ^8?-C1(8TUj*y}ZcS9q5Ztt#~GNrk>Uy!P2EMb|`LRsPg zsOD!4mDkUXl2|FAEOX2A+Ca1M20R$KG7A*uW1xMCROc%CtIV?Q>vD1qkEI!(>L{IA z*Vh5qn?l+!vz@iN7hl&B*AYaSmg&SmOK&}@8vL5Mo=>K%8}sTLIB#D_WebtPv(hEr zYi80JB99sBx#KMKhv-GrugzAOGTrm+8F+XLEhKT^oQ%ORbnYm8bJ?fw2t^757i)R` ze~Kl%YvQh13o%PqptMq%%6d``yG{3;?}TJ_k;eI2O6~g@mv5S-El$H<)B=BH@x&sVlfb+7nV5x6UxSa0WPJx@MQuO zGH#N6*|PzIgPXzqY0Lj(?@QpMsIK*I?Nz<^?E4Hb>^q|%L}75pEt&+AxaYY>Me|pa zmzSpx&AzEIK7DGQCK@#g@fj4w9aI!S5o8&*0fyOUdZzd8+N=KGZRp8>XiS(GROcv&pr2??|i4+zk}XG7Z;gjD5*mcgl|X_^bY#{;dl(0@O44S0EQwYEoJ>F zKEh5#3L!I|o=%yD?2tIQxtaRpkYd&(QO9->vd?%bEK8=HMOVJnKs>;%HxVi5fz8Zj z!7t~Omie01RaJXVA5pq_eia!YML8Th@<^Tj2|e(@m3FPdZmcd<`gV7*-l)QEUNnC% zuCsPVz2+gtBfxb2d)BgV)HwBdXux$Q_+L4POhla4LwfUHSc*V+A>{TA(10k$XJEr zex)elBR-G(tim#rQzn^(G)&@Kx80WFkQbsYdwQF|mAYU3ys0~m~^&c(!lv>4x1sB`P^{qSghKf%bI`6W0-vi3w+?cpNG#&TU#@yjm74YWm=Je zqF2?m=JdS!Tt8hnX;Nm{&e(%UemP1tk}b)oR$>dnxj>Z|;D0!Ma_PiXmoA*Q^AB6& zyLnZQCMEa7JBz=wlc;jLr9V{*fypIYrgi?fzd{33dLZEQy7j7Qzo2F#iALhJNL?u2 z6d}vgPO=9fanw|lJMxRbSqpBc*9{~$B5u1*45|$uwg{FX6TX~drA$tYGODp{`MWRc zr_7(9CB2!qh(u1ZZGL*i^vXTxh|bMmv9Igt`)`I*Zid6;dl1ws!yzQru?MHsiV8X-mCs=aPQe-!7p^y}x&ewZn1sU$$fq?T< z&tKr{&)b(}f(0c-yloiL1Bgtbjht0otw}8N z7Pf*K=MhRg9#1`t`@*DBk_jdwuV+~6XD-8Ck8s9okXHWJz!th8k-wC8#an`5=_=p& z=@Vbtuwh_paX59{k-GeId!Q{H;0<6A3%s75FzbeaIIDs1go#p`1xbPQKje<2fT00||L1jFujY!MmNxzSnOIFq6u@@9$r^@qdxkcIDJ*vt3qiO(tx zhZkrm_1d%{Unv}W)=2t2-BR=fq&*qKdL5*G+hEO^DvcopXgFU-li-CydzRkwtMvs% z!R^d%L?8RN378q=J0jo49fJW|0sj_LYE6Rz@s%F+ovvZ(rK zixqy1#IEPTb3O~ZuG4r<{JtZ4uYaSfJBMQ(xZ!jB2ki@?P=eLKE))ch%Io696$fw~ zH$bxu>)LbOS$(dm8@G!HfMQ*Co5G2|oFmIZ&#(!TZo6&h1Td8o=yGg+8Rog&=~AuK z^Gz-&E?C*xH-+@JwQ@ZFGejYNACzhjBeLz+u+IN*cLf;j_THC!Ta$ys6!@D)2t3vQ z>{ioGiU0tVXKkw;IJPl!F24RyX)uR;R8ShnLn`#qEqluS-oV8&ad$B$X*WgUPw0A4 zm`Km&mn+2 zKJy*)HyS{>Eh=Z8aJDRoQ(;e!JDk~8nJHLO_u-IU=KgKnm-rd>Do{`UR^**k@vdYa zUl=$hW4f1y3&?_VN=pGs8oGnNCsT{xf~*yd&~QUoAwU-zxT2$!^jEd_mqAB&x=b^1 zM)_VmFMTo<*i;Cwgc(Ut*-IfSB(KOn)vwxRkS8ZQ#C(T!g-xCDJw4Q+ICQl=^pXx) z^Q{sK3uV{bAqfSqi6aWuka&7cu_T9(5y(gThE@?E2i-&T&AMxM+MHMc4io=&jjCCg?1%A_$>|PW%oQGVCxf=l)qj_GOJG$q?ar%ee{39iN)_TCh zXV);G3k1&dZ0HS**dCV%ymYnSBmV+XZs!0i{zAp@@P4pF-il3xcV;ZO0Dh$@&ZEJ& z@_a!>_|dGI`A_&Bb^-c$X1{z4=Cpoe>5_&(_uE6?YQhifL}a| zcQc#G_Sc2BwUvTw{XaBIoVxab2lnHAc)P7FObL~+jLZUY7v3S?v!`V{MRJq^H5Y?< zB@(R(?t$RV1z>#Q%6tkJ964g=%)avqZxWl%Y z6bG|T%I3z-KD~@?1DO7Tdb~h(B=#IFye+>tHAGrZ96mfj(~SrSq5%TM&`lWJ<-`|a za(oK!{4@IqDj;T7RmEJ6{FHZ@#Wr|+F@VD&<9tnE*e@Z8>zhai|7SRR_tRiqMyYjN z%Z{t|mYIP-lxlgy2}#VVF5Qd>x3@W#DbpnBkmtf@rDHYCc~=zdHgKzip*L!r;}+0l z2Ko9^qzP=~K7TP2GaTuy?o@huZLRpDjKN-szS^v??&GGzUR^z*p$hj5+?T)qA2~OH zn@i`I^DM)8H=ap9#aPTD@Zz(aUnwaF2Nc64XCap01Q4bVJTI4iObDM^VoF~ZJz_l+ z;BHnR-D-F^ocMg1X<6M-)o9+gV;+!2|49A*8TTBr;XGrOcDig#^Lfdc1|Qz-GVx7@ zEk9WqEsc_4`&HR)PGr`N3;F}9ZL^{;JZ#mfRasJ9Z8~x=i4@T=L}_^MKc}6`%(-}> z=<_-gMVnOwo@DxC&~t+Om3QRB7pn)j7d!eZ*2hUI(r>j0vUVSw+Dkc+ACAb%AS<$6 z*{t=!@7KK1I=goMeiKd8)TpEgVaaih!}jzAD;CRX#-UJ1W*lZ1f-`m%j~<=Fx_%M5 zl$vCknvz^91t9&7fn^{P`YFp!{q-VVRjw|50Zzi*_?S-Ya$MzVZNpd+CfI%nyAO=OSaSWe@J zy<~8dYi#&%w!+bo_mgi!O5`$~VMf`S@uJ{li&98r@8wvlxP5Dk)R%qabN`h;9P(=4 zmRRd}BsPGR#!?MyEFs?VuDV`YQ%hfJZZ=us zz6>WwDLQffsS6g2Ip?bH)cW}7=}0xS01gu5E+H$c>O%W%CI6M3cI4Tgeh<91y}e9u zn4e_S%39>btnQl8&SV6F<3oM{LAKXJ!)umh`FkFnyROJn zIIlERa;jr7KVW&TL2wyRN`82}e)_Ha^q#o5_x&VzE`SPfE7OiKfijBapPun}K#kx| zaRv5=h!U#?YVMO$x5$rfu=4tZ56#K$?yW+TG^w|A)?DUgKE%1(^|?(ZdBc zo$b#+7f+ikI}yAMm*X*u!sVgWgUg;!F}?z31;_4*ugO~0I)-(3wy%1vJ1B=Ii;Ufd zG*asu4-#lIxQu`0-}|k2|42o`ih`V3mZtDbmt`{JM33YLx9UNKI@A%D!2Hmf(z~$T z%YZ7-Ag{mf2;-(c4#&qNWZyau)S@RK_{iZnv66R5F+6hrhtyGT*MC7Gkp7W(@I|=C z7cLs^IK~OUg6oXTACHt(*>X|b<>>Avm2*lE)OK{`$bxmST*5*7S92Hbn_Wdky<;NT zpPR(K1q=E&;H5bSS$h#(%XwIbc}laL*BggGd;2WC2O4a#sy*5(h(fDH#L&i6A(tnf zzof2Ce`ZhLb4ksa6_U9-qA{&W^mwWeN%#%k%O009tt#-dEQv<-=BjK&VaAtasMG6E z+W-2!_h!Mfe7odo%F`94>KSXhT&u!ODl-2~%W`+IHuFcwfE-<9{yAA&4FnkE+$b-S zHA5@S8e~V)`1#yet-CxViAqvUtwcyh{_?}_e8^}A+M?wh@yQ4cKE-AM2r}HIiMqla zABRj>+STQmg23ztL5i_(FXDkg`siAMP)0<(orI{R3fOzPY=(QrNoN)})D{iIdmnZ^ zc%(v~N)N2+%A98t^AeEfJZ`YU2$2PsFLA~oLf8*HFsnQ6`ivF-+Szq=2TdIVk{%&b zQCD9eD!{ARQ{d^(Kw)^pDD*Ff&>28Rd@7AOOdisdOx7pU>^$2w{kkhZe0-JCiK^v< z=xtz+n{@QtndxNbdlV(G0)Z*(dz16L0$U6;Qk(18MIhf90nM{r;DjY-)&^Vh_YPI_ z*7T$vMC9w4HYfaBcGH>{4%A{P1eN3b7YRI5Y}igm4{!ZhOgY0`hCf@9xGsy;9zPjb zGKQ)?LtW002;Z06q9?<`Jscs`bRwjDe)rMF;$oVA;u9ZW{$o$Prq3JndP8PH^;;Q| z$^`5f%AuWiNUQ26uEdcG56d2)j<)5UorNLW8*b+U9mP_VXOp(aVEK9?GT&!iMo(tU zpS)9Fw0_@WzF#|NfW@fNVZ|V3A7Sa~5HEW=QchqdS#_trd-KM@0*>}uK0zgY2Y0l!$wg7Y@5<~gwqwr%lgoR>qSy~MPbCpIe|F)d zp@p8Ui9@MVnWM8YRuGBQJRAr+sDx^*K8_wJ&SV6d;(op>R)WP@aIms@Fem$GflC zPkhR*4{i33COaC(kpY+(_?)@Q=_3&($<=8&nb-|0{azV;P{}BhmIlU!Puy{;GO)YCMvUGB7q`AAh zZQYyE#C*^Nq6cXw<~s5tia7H17pw;&tnX`xFFxDqNv|J2s_>nc+IqLHSlbnoN^K|Y z`0Bj^8R^kYa7KHnAl+~5NcEG)BI)BVp!NDS2Sn>21>hNGJkPpUWV4RDc3amk8upQJ zf5Ezy1}M01btelvyt@%TmL2^&-b|AEc^}&iNj=RR+G;5vm0aR;IzHBk7U3MsNn_nOq!yPx2tc-6Jn+;joJ_pWVN*9Z*1B>^TU z5GvLo$lwNn<1RLb`JcpnTMoSUQ)=43^f6SMeP!*g6){Cq$B!FFrq7%AH)%CPMKv3` zdb{`V#JZ>glf75dPXfleGi-1hvvr{{z}_}tC;Kqv%57l9#L2o6@?L;dcc zsD!__P$TMW;oR&Knyzh(rPDKFeBmiix3ui1^1s@VDjX(~8+F%Rh#4{q^8_dt_Z`E; zstfGACD^yi)%COguwsS$QO~Da$YzlEQ2WzIU3297&sPsLL8Ae0tIuVezgV{YC{oEZ z`6Qu;W7$T9Vdh~ZsF0_3y&j1~4{Z7Ji!VklNM;r$>XPE}(7RL1d=VPF)3<5O`ef4l z89@7zV!9(Rt_EOM2bS@9|9oP@@B}q4EWYhFi_S0Vn51*8rKLrtpAT&RX@yLR)vUWE znR6u8t@8=ol4Mr>E+RFQtYiMzJ8Nzo?)iu2rxGk0D+Hyl99=th^4jfPMT=q2%|E}Q zV8l4nwQhrbx>{gJZ@+3rlZF%IIWA`=Nvj+Z-;nFQ0)O+}%bJHY@-AP8p*|0Z@J)v; z%nA84uSfn;Se8Zz0;!)+RD>wRy+V?P5SMw#r3}Me0=|Y)mu0pipys=N*>|0xxC=O! z`~b>H0Q-xDvnS6QnTuRGSWD}sRP}VkXYGu-fqdBqyX?q!pPwFBsj5g&Y~ISL<}Iq` z{*+keCB(EY0zv;m!zRDrc;*s~RhKM;06DPL;0R!ll~-~Z+i%2T0}+yQ=gze`g(N`a zlmTs}8fk3YPh&o?oX`8`S7Nc?N#Fj?Fz@)ICverHj*fT7PU!I!ogElE?Wla_;(Q-a zZF$d>s+~Sgy;nF=#fY&}P~_Yf&Nt+pW$ zqTe0v$B+nLCn->>sSiN7{IqSTe^fQ|sn@po;`Bw)4lw;CQ&~p17@`<>OtQyeoLhuQ zW?7w=bWivD`-g{==YS!kUdhoGV|``P-1(jZJB|uuR$ve}$kjybME%pdV?nx2Iq9vTgx?X&?BiZG@W1M2|2rQACwd7`Muh0R z#}M}XK9l+KyE~)RAmlDu8I4v4B<@m%IO+aWs`*^N9dCn);4IZ(Bdj>dY^6VmfKV`W@nt zuayf&O}K4P5={C|sYX4xjD!6>yR@{`Q8Vq1h^*3xIy6P6EwXrVj_oY2T2tZmYXz^z zug)4)vMDU^tjK}hjuUgjcR_u<9yiRDfFFj$Y(P0!`G?zgLo(pb8eNp`wk+gxVXij? z@oNHN0mBV@8Ox~M%@KvOiDT8kB8SP~-tBY!ua6#Glp53-25_6mLdt-Kl9|(|_W9|S z=dC{C&rgbT&pj6wrtD6WxZ8Bo98;x`IfdSeiIf-{186|28C2$xKmSG#P|xw-xa3p& znF;|)pufB`S%`<`wyhXDOhzZynvC-}OO)HkPVt^!dE6<}?A@8dU8*c}q?)a{bD06V z9(BkJCeEfp!az(GP|Fny*F3CUl zQ)~2L@F19VT*5O6Y+Zx4!TiZ}%{yRQj{=6DFkE|4Nwzq8z=D{ob<2`=AiPM7=g4$0 zp55!$?3)}>x-TFQ*5Iv)hv^ zY8OR9Q6)~ZE&T3~fb6C3+d=eOHGHS4YWMZg$I$x$bA`ssS^+oqnb^q;3C@=`enm(8 zVhC2e1E&u% zrsK?-#~w2mE?k(Ss-*S$v=2H^moHz=4aQ3jssj}&1MMF4eJVp#m>SQxTfuVmu4ysr zRl(gF>`z7ah#m_xR;MG%ef?`?1zV}$rO%?|{k{>}vASbj3zOG0EbbgcJDhXQB25k4 zJF|*JS9hh3m3UJB=6fsuv|!%6kF4WI)%~;n{R-GtJ+Az1aLP|X-(q)9#v_;WFQECp zWmtw-;$eU#Ws<|f;Y5BnOWXYP&e#NGi@sQQ$WPCx4aMoW-(56rdS#)cbBT1ziDRpx z^!hcushQaIHi`oGg14`;>9K>%(KYZ1mH8Z}C(BJ_IqPV{VmrmIz@PIp1%KHYxfyf) zzfxK4zlwa~?=6@8onbkXf-FBN9m$$pkyzfP+kf%#Bs{9ZJDCzF9q#XCNHkyCNU+TJ zAv%617QV0|b8&CBDL43kyR4aTysP0sH0pCJ)C<}vg9Q-yH_10RmubLKiG&u+dtr{t zrcG-W!auL!W#t!>%d4lus_vs0!f^;Q&M@gV+he_E7+M!$^ccvG#(4t%xqg3m%E_00 zulx`DR#<3GL)N~7y+|r(sc@v{mjI#bLge074CInAlSVZSifg1!qm>(5!y8n!@`L{V z%E!RckMeTb9ld{LYa(3Jc*^i8^X83O(UK|4n^R~6&%{&D8sUbkj~j}N9<-h_$|sCq z`1s6XJ2X=k$r*vV(Y3ej+al86_h}%xx*e>|pY*#wA{)U2&_qi^7314l`i^1v?wMCU z@W4lIJ-fTRb;jfcogw|(x4&f5dK3wsOF^h#LR|A|*0yf8ZF`ArJ8_=lXF^ci0Ilmj zL3f_CLcU*BiQEk!g}jZi_! zHTdtW>WbB(u>*Y@Zu?-XqietFh%~2P?u=Gzwe{nIoVuIX&evj+a{c|=w$WV-G7&jm z+hWShj5Q}yR5b4Em)#IXAp_;mYkZ<6^c&1E;4zzKJJ7vZXB7l5+(3JexK5S=CfLV{ z!uKtkeE?Zgr>eG-?KiC%c8T;pH0S$-pOLtSxHNpLs)9`-lI=L?=>n(oig zHKP$yya&vG7mq9Uui6wze-#Nq?vXgw=h|d5FS@_&jrBisY)wr*bqKqxIqEA(?6!>3 zx^Qzw8(l1WWRFO~4zaf>8Fstj1Fz-Q_hKKRh0-egJqLqr6Bmg@+|jdV%Yo8T+fJtg z3DpUdNF=H|!W@J`28cjD$QaCJhL-r%)bjFHJiz^+Gd|T-_^%Sf^&lFk5=0?u+;rr@ zDF}t#l1z>SchjYuKok&zWA|qVSlfB3-PKmqNd?DRws93CLYeFrzByKw_v9-~cNFbS z5g`fDUvKy7pxPU7I8lLq^wCEPn?RH3({(5R9)A7O2JhstRaZiAsR)B{BqD;WD!aO~ zrg#-y*jnQ8P;b;KF~dF$p3^p3cUsng+BmHP6^y~w=3xmXY9WmV-ALtiyPlP!~Z&I?`;50Eo`ys4fzv#x9p`pl&s`=nA~zcAg`o}FD^-$$>*cI-?UoC0ET!IJs|_yh9&{dqpqe(G0>{~M0U z8Zex764!nRshw>_WF7)iGVJ*;@a z*Xlzn=zUb+ZrBqKB^gukhh=NhVHQv`WSSwOD~3su_v`47lVE7*);CDYUaOw@! zdPGkcw_|`uh#)Pj6@;-Sc7SMUnqe7#CJDCFz3tA`QSHl42$d=q)fOw4>m@Za^V%}~ zaqOIv>(pS;+4V|beo?6C7@A3he!t%KaDA$~%gfqrh=qAIqsE`?SEC=~qmp8_aFi#k z+~;$w??LO9X_>=jpE#BV#?breLHnc$W}>fO|L-+xwssWWjceXU9yBUE_g;Yvxb5wB zMzydGGPQ!ucl*5DdN@m;9c?t{Le9ezXOwyhm5Tzba#=I%f%Lv!J{)jO-p30$n}S?lZ$EhFPUL%k4Bd^iUgQqPv@f)Xb1$+R^8h!jPAW`< z3RJo{w0T0OI;{Ce&NQAVV7(V8Jp4t1(|&L^!&imrFO#ZzaLC$-^c4+D{^dafg+?Ne4D~C&uhf`qh&FjEJfYz zJF1I{x;0(@Av$e2(iER>n(V_FNB9%0azBA7Vg%!|z3@o?)|TDJ8p7cuwH+ZB(`1%q zzk>~>q8+1BUX*wJ4_SL=NF3#lN6#xieeSzlqo|1K-2E1=RF9HX?$ zql+~9lA}=)C>%Gnrv8L^qoHws2u<-`GFeEScT|W_8<@`1w2D`Wp$7Ya9kzsoo(sv8!~TfJEp#%1Kh<+A-tu)^*zLCh>=Q8eYHovzxsop4l90 zMhT!boXd@kI5b%<7Drb%ZI%r>5?`KgL%vVG2xt1f95cCO=j+dJ9#iS>pATUvNK7~8 zP)EF{*XE{8^ zI%B*5R)ULI#<>9A`I|J;{(+xkuH+o~LPIKlDsQu=zJ?EaFoJBS$hK^a3TV_L_bmFn z!{Hb*;hREotdwP+X&Br$Y*6EO^(1m8hkcE78cM@WreS?gV4eFgi{V{${V)o5Lr^Va zIr~OIur;n>eE=}o;mH9!qkWoej;32CyaKU57mp zyVz)u7%`2wr@|(=$F$rsh2ermr2Q%Ebqw8h`qH>L|AMigB*spt0x6gE1Iw~cw_Rsl zslOadhyu7jkobn>JY9w?y|;EP55x}K8x)@E8l91dMHuMJ4&nNE)Z50R>hO!q0?I;z>PL!v;07S4o&)9bqIEPt{iu4>xE#IqR~o&O%%J9FYk3YcQs5=TtVI5a8#dL z)JX$%UahIgZD||ABnhY51L&MA#>;n;ruJya>$$5S==}{Atbd2UyFG0fE${)D5i5pl ziOx?we&>~@#fx)WS=bq-02^Ax+WP;4x_ub}G-9^tETAh5F9I71VLe+UY3yC1si zp?!2bcAg&Bx&y1`bvDNykAe0uXm+nk_I9rI7299+e`#(#CC-{&>8B33CltkwV|kq} zic-T0Y#Hh95;ok4B(09;1dlU+cz8e|pylg@;>pOE`bXR1AC~>ncMH3AcSmETZ)Es_ zCq$3=N7sx!f7Xb=&P(>?p`(JgzNosPvRG z8|hK_qlE6W9ou?4%NN8Nv2vn($Uhqx2WE!B@xSbhWzTz|B~pg_280s+CX}QH&J=at zUeC28@$8kZVJ71`|1xJe_o_Y;(fhLFV)4w`LV&$->Iw5kay%)ACI)AeW5BM_2vqkN zxCr}QQ|pAm>LE^Gz6^VG7Im7!vO<4XnoWv~_&&HsGhRu0Bu+BP3co*#DsJ+y z8?a~5I!WoY397r-0a|<;h`I}sYWnzCy1x%x#ecy-J;}$|#|l*=r$M{;CLlBKBY0pn z^4XPxr*^8#u)ZM6&6;<^4Pg|OYb(_vu{il5Xy2!nVw5q9j2|z%GC$eLnU0;!00)3) zna|=Lmk!8x`m>cnZT-Z`Stm{0m>@_YlQZ8i8(Uk$Cti8u*ex(60M{eK=4|eQsvwzq z5z9(j!oi?MuY_$cgvD~K#n}CYyc}KqfAKvkCuqdTE(&VFS3;k zY~`s2v>IlHnyDvvB^O9i%s?%^m&AO036q&#S=m2G__=z2+mkQ|+=Ldt1MRl}2u7eG z*x5iF^>QNjBUMYZ(Y8?}jA@4dvg5_TuDp=fIer*qdv|Zf-sm>@--T25K9qBmM+hE+ zB(3H6drNPoJhwoaJi~z=xO-J3@^>-u;n|E(qrcLMa?u0q7cFqcF zmU0^qVQ5)Ab}8h|6wklk2)VFhU30*ItslTkHJFxjjAPLuQ10d0RU=K={Lq z$K>sTZJEJ#d`zJ&oX$wB0^5^{qNZX7j+Z(271&AaHeDxa%iYN{Rn%oLTI|dk z;6>jAZRVfThWZng(Vm%E6-c;t>XDXM_oKso;`0wIUfkt`iYGG;+tH;)cfbKQV0NH& zsRKc^WyJo^=GmXv4mN3yJ*6%*9N`0*UnA-HpS=oqEX)>2!{9V$EpoHDXZtSIG$%sK z1H8w6ik0|ELshAbGS{C}a6%v!8ZNbwbL*i^&lNzeXYu5C!(`TDvTVn_N?Ox$=ATjJ z!>4;3{pXI&UJ&p~HyC>I=FQ0Xx;;e-H6^sr&yjmn$NVLnqLUbrPmj!Gc!TH{fJ@;K zGix8a96R-(UpNzCi!+fmxHjY1-#X^21tn#ieJ!Ub_i(ar@?vN)RPYMJMmBJ!cxAtt zzFr(T>6~pya7Z=ls+lK_^Ah25IUrpIBBp6j>#Yu}FDC%$!kT|)RD<6L1V|z@EX;V^ zcg$Gwdk~}-S*~>hG}s$lTl-cow#oY@UG6rz*zSwx&wcg_9Bc}1SxUjm%mi(ARAI38-%@7w9v}pf=7%{6X1rl2 zIX8Bvmj+ucC;ZBN-@dpTeg!d9S#&JNk&}UvD2!*UO@kfe6dGwUP8rlL)(eG;7o8t3 zJV(WFDBr8aCujJ>&l~!+D{=GXz9P`k0BGj)VnUq z@@UR>w#p*^ypMI>>u*WZ?Zd#N8q`Mmor9H#8|)~eztgyEC|#3b(}TU2ZDs`0W^C9X zO+9YjXm42hKD5&RfTAbiEy5nitacbr^ zl3NPin-mQ0LE-jjc7-Y|zUJ9ia4l30nGiMG_}sk!cW!`8qVc2te||pw8y{*tX2?BUM)l?9;zC zbaF4Y^yj2CaTwyW~IuCm4xu=^Fb@M1U82eaJkaDZ-u zP;2HG?RmCK?+0nktJsoGg%LMIH+9O0G2<GMH}zM!Z8j|wPKxP+ZxfNS>Et4#A^lo ztku(X#T5glqQPZ-QU6|u{(<=?al(XQJ!(%+3S1bcJEpss_t>|KcJNVbw_dRj>RW~6 zm$Z+x`m(LSIgLb)#{UI}%Y~xDz9cEkr3gFrXD#mXyH_{+_w}XS2ou4--+#Zaq_FB} zaCE>D#Ky4ei-byjlpyJ^2QuA6b-O)f*k(%2F7c=+?@FNwOn|$N(}XJ-j=L1DxM!nT<0aVHsK)P7 z;`!-gD*Gwv3mr7Yp3=Hg$4?uU_0;;-;{tnUm$4+mMv2?U|c5YJY_v<=k4ZwQ=N&KD`Tb^^l+8#eT|^a*-o8?mYV#;P_McZy|OJ(+m= z>CHW@D5&_@#w^uzWn2I&!oH^#I}Bj z!cKvS2eco~G@D~4v%Qw3s?ITT!2iu3k&oW#;G^2Zr90NWvK42u^7^E=o&G7 z3Cr@2!l1q`or&ibNX8Z{o45PphT|Q#c&}!bFXPDhuRXA9*DeQ+v?R=I8(LGTbZdJT ze4K6}aroi8nwxX@Z7janfU$qZNJw}^_D4!kxtpwBz8)EymO>yGdV>Yy^K+95PScR) zIJ){}!V0FtS&pD)$8Jn!PpAr)Tv%38@B`W8?!h+v^h7K+;L6Xq>PW;6Lgo=9 zB?9J^VSWw?bsL;mBar%KImcU9tAg{RF(v-hPM|pJHP~t0Z1%e~VehXp9{!hAg6E1c zb5EZF&zGG?;z=RG|6i-lySq9SUnqun1;WA7y__4Z^Y{;+BJ9{=AvZi`I>hIlh+ zPoLk|$hEInLA|3E%J_TU&wfHTe`9w#vcoi(w=7280*vo(;d}q_tnyGRe*e(*w9W~} z9vfH9nX+J>8cOmf#!5Z&j+P5YuYj+JmPxNEnLN1ynn*PxGC=r=Ezs^aVep+|JMKs3mD6f!Lb_5^M|qc#JaRXjXAwB~g2?1sI=XUrCE$KF z793C+!w@wd9L=`N8IC4YH8)cY8XVf3AJJfpoQ&<&JW@Rp&;$Vda1;lPwS_IjLIB96 z1&fB;i5YVzG0mm;-p2rI7z)ZAE8E(z9=gb*inOT*935Kn7{YNApjF+(nC9i^qCJRa zTCMU)11Oph9A)2cZ;n>eZaCo9{XSlCMT5D$xOf9w<$D`HI#j5N2;1DUzwgRO>EfBpjBN;qFOAHc1yVK{ak%aW5&15EWDuXPEITYvp9% zbE?k&<=@p)`X~~|{$-YsOXPk1ywWC*ds@2e@ z%iiox7q37N0-8B6>8V4J+9&BVX!}3vXe=-9_m_Cz46Esv-f3xizhRJb@xXg1%+4_# z0YW-~RN1yDI;zOKUY_xWRR}G#6icjUVj}}RKXEGKnFNdKoa0RAGqhhKFoinnizI0`)N|cfwWnC@147#VdVry zBgnde2Fd0>=kGmo{%{ZMiM2n2x%Mv4$``@`eHljm+a#O$-$wW|@>f&y8|&4dYnoiu zh3|5tIGo^27I^nd_&B1!o3FnOgHuf;%yiaz(l)I(u)7_hbDm=&O-&z?M@%AFporY@ z5UeVKI8p%t{&vUld3d4JC-LLqj6N|aabHFbKPhD!yYuy+=cFC*qXvShnh-#wcJOb9 z!{69Bx^ZAUz@)Kf_*g4k{`9~Y5vp6A3@Mg?aR}rl$>kWZdQ$IFPuE7 zH1mF6=9ln>od$rHm*JT-pkOh8&l9K%BA%U{$Yg&fAT#|`@J=p+V@W2CM~djgo9{ zFiOK)8zC$}GQ{2TKM#(yO~dc?1lW%5-8((y<*q;N)UxHl9etgh6&}u8#VH8a)d3z$ z^{rC;!|gPenh1O=OaW#p9Z@&Tt}p9*Z!I#fR3#fEj+wwZd`va?P~*JfO& zTo&8~SbA<0GZ3ffqWqO$6OaaTc>JNMrA!jMkAOI< zlUU4u>!KME0AU22j6w>z6)i;YGksx;XSo@b1s(WqKY_GlYiyz+I4>xo^N>uWl?h!B zs-|05tVuKl!6Q~S{(*?urFv@(b&`L7+e&D67>r2mpz`Y*|=SZx?2F{(Dqu(ft zp*P3)NoHr-nrWKGBM_KTUUR?kc)4%eLTF6;-bwC6wbk`qDG)R}({$cs9b0<-xH4bg z=KkbSx<$T(%*mG_N_rI7TyUp@XOJGmjj!hH%y%Z0miAIIAOuAG5$zlX%{+tcehh@) zG3bdgWY|r>j`c=7-TSJf6psX&w-lyal#dvnJO=Lu8OJc5OkY7W#s%Tq04JQ+vC zafG3^YT9UOcQ+8~8BA8$NL(3x z2z@s~I7WolM4X9aJ1sJ9oH{0v2vA610+#N$7Rbx z$s^f->u|v$)ix4^30OA`8qYY2@o1!RaQt&;c-YG;NYpxv6G5%e;1~RX1l&Dz#o)yVeQAZaEms zO6&GUPvUsq;Cg3O`uOMpevJA0WL4$RXYO#r){-%e4TFAu$pdjW}>|_QD@%&StYwaDLG|1JGO769} zzV?jA!x{*iug*w(+Q{;@#Cj1@d^55apIu5k6OOCT#R}wZr~V&g`@9lnv_eG0Jvp_+ z`$4|k!{I!n!uQpV=uFsWs7+^mrX`ZDst?%BQGvZ^QfU@%$$ht1oh5VTZz%X5c+wV; z=dp!$iX7s+1Jd6=O)AX^*<8P1CO~fFwv79|V7kpOn{?E@*h`*|Ed?Us*yj)(GafiT z5L~%;_ZpdJN6NCd-<6hOE{*W>{8ylozJv?RTM?v?7i^SH@jp(OcQ(??^gBfKS{div zmmj^o?~H{DIiUy9Ib8b3(5x?qE!B$(t;LgWakS{>T`S8wsBMr&$uWZW9LMHP=XmFI zhGAvcV1X9n5`aU|9rMFJHt?GiN!<+N%KV%ZB5WKHaede~#aW)|1=g|Kuh8*yj` z3Ck3c&^i;Uo=IB)Q7<)3{b2+?RDa_duOA&Ye_XKzJ2Vv#Hl^6aGxqD7T*v*B{#!vK z3bFM+6b+F^B|iM{!$$rcpsIVjW#1>4+~KNE|aloDI$RW?+~{!u&*?ZVA|oVT1ux zkT}T37LqNyJrd$dOYFr6{CT`R*7b+H_We)l!q0uNbd0nao?jziYPHW6+Dy(JpE2C; z!gSaYmc_TavuZe@Sx4z6Nscd5EdTKR^*@yV?Ql2`sqlTFGc_94+H*k=^(r*p zUH87bB0?Q;`G#&xWE%iQqua`M7zF`WVp<(7j`(bj-%wQ4Lv3{VYd`9oPNz#+EoK?C z&B>UIAAnHhA~0RmBDnh|>|E-g`aR4Ly90K|AG<6U;&kntab@9Gz$X#3G&eM^IM4+} zjRr%w&urV~5BN$)cm(cbSGTu$3xs!``n5L#8SSo%ByUF@u7I}dMVUX!YVqH|c8s97 zfrDAqPULVfRc#pjGcL4b$Obslo!<+Lv)IkJ+n?F9zT>QMM?C^t^f{;>_4{W4dCOwB zIglklB`~~!P&SBc4WEG*aCJDpkd4KLeT$2`j`hAFi1#Rnq(d7OgE1qVC3GXQEMW?4 zDw*XolAbV0iDE?n6Bu5h=H%stSj&MS@V6@+;|z- zL*~OS{J6_|o?HCu+j{9rx)yQcRJh|DFb z8e2raKk!9uimKJ%ihUUXfKm9Z!y@*Vdy9gb=fRM$OZDYJ zZA~w3x7!3HXD%KQrqOJ5Wi6gv|>@(GAj_khRMeO{gOk_ zfa3>@O+aU$4AFLMaJ7>;FIR>(e9|$PZ}XA!hkIag6A=xuqr`9pQAqZyY;lE_j`TZq zRbHzT)aQG!dm2~L$j%?P|E_i^a<;LGaz<}F6|X3%e)(kVg6V=h>4K|@WY_DaWw3i| z9{7h%yU0^&wI%kNk!TIvX>)%76JX|?+M+uK)ri^HpE?V%pCCT7dQ_KprWSe+E8&}i zE)A;iA^pjY9xaGjHiqrqI{=3k@!4$o18bXl@|j3!MAD}Il4#3w*>(tJ{k*#*Iy z_x^%Tg7H8wq;*64rOKL1W|fvEp&>Hz$nb0whc>$ev;Psn)R%Gr_}Q|?JcMXpjc1p@ zS{g~E4H!|RFm?-oS+Qw27GO7a0H0;cpczkq0}Zu=)@<3}WCdFUzM$^?teRD!Wvh(J z-8J*7s~+v?N=-$ePh+{@>DG$9?Vh6QL>0qnrBja8-i@khR*$Q_8Oc!EH|&QercL$< z4$u~^4zxj+X(0joL5>0?I@Mw1pA(R*)CPkW;*$RSWulsF*F3%qXIV3m?6U3L`SZb4 zxc>oDUOA{Z$HFAD658rht?Sll^XJ#YF71bw3yU<4ae=^oH(@bH08`=HfYrUqIjNP5 zt~mUpk-*8*yXpa_~6A; z7cBJjr{X`&*x8_DDG|WNB86eGJ8ATG6Qv^JIc9h+jsRZbuYo!Bslf%qzrj1zqegN- z?pRL;NK62zlT)#u2~(`$4x2flc4gZRii8`l2}(m!+t``VOdim+_H>i_JF5h zuF2_zLD0_8&Y<4O8GLXOahpH z7C3)Td#5M81h(LQY#X~)N6DQ&F4L;IOrxzjk2coTQKA@kS1h(cCmb~!fHBOSrg#b_ zZHdM9tc}HDlu50rGVuOpm_6nHGK}k32)Z=j46&-V1V=H;2ijWUX~oEL zKyZfP#fKx=E9@KIpdJ|^?XDJ7ShV0!&TO{H8$i;OOBngMPHpdu%)pslpEOe+V0w--ikf3&8lEdU|E?-``3yHxqt?~_gD)1cQLOZ?9_z^ z+PSyCvU0#IK(BaiS5xb0V;ja>Kwe~#<^|Q+J1O_wPftCuWYX{T^}+M`n5y$Do5qhH z_;p27#Fthr=L`gO419?{=wgnA^Ji}_Tc+jNtOkAuM;alyNl(WQxSyLha9PlU!^Wi8 z9H(<;F$g>F16^q-BIWom25vp_$D#MY!QSyll?o+@`OB_Ior%>OT)jLmIK}1uMy9iU zr)+wHGl52`)v;Gp1Qr9;a)D%`JhQrHSTWe@Y-G0{XAAt#2bWJxU)YsCiMjG+u=}Zo z%TVasVRht$-cZ$O!91k8F`OQ-(06$Rc5Q*lmrvgp{gQu%-`3U{#QGATq1Q32G#WZh z*AD6@#W6~$ku1Z$%oe3zf&ZY+^2y%2mo1ZMZm+Yi{a*Rvy&itJU|>@v?h_ziHXt2u z4oS{UCF2`rw(6wL-`xaq1n(kn7u+g?RcTOt!tNCTTuT}9jrBbP+lFCd%AV5NeU;se|F;PSXML|FiMQGdB4)L|xZQJ;4 z+it+2MZ|&FA|L``NWv5{Poy$cswy?#x)tc$ zv(Gteuf5j4{=e3986BMI_7fMNC^DxQ-iaHWF!Uxh)D%j1J^J^8M&IbGKM8jt?DGO^ zvWIfn-thtRo3s*)H%{P@>@jOevPo;Pn0~j5yUx0*yrPrymsOV??pajdr3DB z!EOu-ET{NHRs>YFmT*ifeSTc5);qbas;*$R2rYHoU8Gdbo&5WI{r740eCfr2GUhCl zm^L7G2TpMIsL8eL!q=5)I5{2;9}6UtkIJGWs%e(9$e0(lgr`WDCLCyAw5ae}fA)14 zlxs1$4Is(%<+l0DpI}(SUsSYE?cu_&*6-U`bT3?32ztH$1jCu&1?giJR1G-6zEUd{ z<5G3g_f~}nkPbD}%PhmIyv?&#!g$>TgC2ml*bR^QJ1}`cB*DG_AM7qrL-;PdZs^;D zM9X4)R#EUGukMDSM)(?q!M6Q%PL_3GUO|elWi^J)1_G{>Y3BjL5*m>>gTxgB#zo_0U1FJAGjyXRC_rDabl}O+4!&KdLqwdbvEN; zQHX1rcRT%J&fQ<^X}Rn~U+!Q9Kipd6GBCYEyu<)&PrWyo`Y8}!AMVXOWV*P^5!3+r zkeT#=wh=~Z1WFbgKCoz7Cp^?CK)(a6Za=`;{IhuA!-!j4ggUhwOvav$@WxlbmK%7! ztLvMj`2?g3<;o?e$W<$b9jl7Gbv0WNtHn*f9mN;mtg(NTs0|Lio!2AT#iT~uK!gc% zN4yaVA3TPm(6NwocXvyNIdU7?6TnDE6P#^`*E0^E^O(huBY4YJsh09>cr)c0P}}O& zJk^D3nebe_)uOjPQ6@Jxw(A4T?1io_Yhv=3!kS(l;vRRnr9a7A4l88dytj6I|I=T* z2S($^_sy6#?Q1K5IB}?1w0uLO#u_lX&WBu0K z+Kz8OUjzC>b zg2xQvbQCGrRs%u|42s6#5W=DWyomj*MG){}!du-9P#!0h3rs(}`3(V~{OJTzMmL+DCE zcmd&Ud(^>;W!&ysYQ!6T1JK+06$oTn*&=fshL?tZ?2pXwnjlnlU?2kU0z;h59qLZ@ z9ByuFJLF4|ojE%X=nwOcXcKBB$W1{{_<8I{|Ct_M=^7Q~J}cH|%$`4=qD9L6+q~>D zpj*fi&@{f_b}`Q`DJKN6$E1ZOEBEwgUx6R<2@mI*vx$(N_OWgI!eNgmhu4VV{uu~_ zJ{bvHizR3_X$3xWA(D!kEbwpqaUC(Qx#QkiVrfNh9u`~K&@d=HG}h0 zkL#tvQ=C(t!DowG<86@=tglp3G#@x0Hlgxu)T`y+C^_Zn4zOF>h;a&3v3vX65AGTF5jR}w07 zT|Q*|NdV!38j#LZqw4MB5D1+O!wg$$Celi$6$FbG5^Zyfw!X9>>J9b~vY`ppZa98< zaalrGwRI6H_v`A>;zb z6i+h4eqd7%+0@>IGTjQiED)epyWEJ@<*OP|1#vSBxdK$zza8-UGIYm3w*XfX1D$6V zGSflIR0nUfY&ehY*pZvty6~<xjwR-QnFJNDO zOXg|@_0GVCbEK+j2hMd;e3_n`Dj!HS(%m9)+z6^rhhpm`i{mpu+NU6ZG2|_n{g5Kc zgH-9WCePfT?!aAmr-uKz3wr~Q1Z>oHd}UQ=9~NS9oNYic(8JtDSPh6Sa2>zNlgu->v1GQb8kO zaR1K72E1Wfe=J($fthYn7EL5RU#=sb{ei)8Glyc@W0%Z&tH1+>sTN}d2d5H{T5BjE zdj=OkSpnyuV6;E{$91&CHQ z8DCTH-mIT~lK}A$7~UWEC5;`c!(|V9e4EK1Ac&aT9n17XD)>AxR3E_aG=XN{h)O5) z>%L3g@?sSNDnlg6;sI~;2?tAxOXfC~vDrIEjXgvy%wi&~CHsk{g*vu-X$Ua)qKCK}R)WbK5Bc-{hvh|Mz>)10aQJ z<5=T1%Nwlv_e3-U9*``p$Vwgo-VU|3sze1&3=Y%cA{mRyGj!rqK@wROJYMx_X0r_7us@A@!6XqKNu@-|Wzq~(~&sz*#3p!DaKYVQ8 zWa>uh-Pv9l%(5m)z#UwOmu)c+18!KkBT%^gZZYhkQ;)J2h_xX`yc>z0|M4ZW!qkwD z-#H{u8}J7Yj~V6YB%zEX%EzYr(rGR&&254w>uYqu-!ubwmnkY&(OG+xZqo&H0N`$i z3?ejfoITY@o!~pgZ{t#cCMH=KNWUySDmwJ^_X5Z z=OO%jv~4_rM*DTbcIA&WNrub2-_4c&qh&0Km+b4<4e_=EoM|k`%G`%{96NSO-(c{) z6iJ#mquF0(H0x$?0K9-0A)t87vx=#2M>MGy8FWE0$m;^(H{&@x<=m6o^8Vj{`5u7& zT0PF{Gg#*1mV^Cq#4ld|`-8`$75O6CB5FIXUI6jr36_`I64A+g%+QPv0{JsoD3X`V z?9jHq{1v?O8Bd$>%>bg1)YKV_TWo@acL@X-dwqhKsm6b3!npCJ%^BkrIO(M>L%1wJ zs4eztOxag~mGU8p<#z-9z~cbr{gKso3qZZvsxq*2>C#iYMSARA&peZ?cDUC;p6C16 zs|OyBhD=!pF-raI)c#CZ@ItHLX*kIMm4CLGI-C$hNU)?fla#%0>9I}Noz!_eE;KC& z4;lSvWo=CMv7fyf=aDR-7i>-aRxbPM?%|H{kOSRcW=Rc99+=*+7enGBsdQyP7(YB? z_+kJeKx>p_HgDZ`%C%yUs)iB4fCVFIlY~4$Gmai)PE|`|qcidmuOo8KB8W-S?|7CE zAvsa*POzpWGYA^f#31Edpvn=tX?zlf5l}qzoW+90Q{OJu*PmjTs8=os+^vXzhfp-~ zQ*XfC`F5qB^d+D$F-m>|!&knCTD&vQqsk51S`Do=HB~+6j<-WG(Du^h+-mp8{OW3& zJS{&jlq5+7K`Tq7H*LdqWQ0%{zm<6ZTBI#3O~U1J+pu5>}KFJ!XTHuxEfLvD!i2C7=$Zrk_ryVGWTJ;U8G2g56VNxV!F z$V_N$U4V$B(}{Xgyj^v=8@Yw@gnDJ2%aQt#KIJ|USUWC2I%D#&RXgj0cZSMqX6o#P(dfE$Cp~BqxFkXdG@w=vU^m7} z=YTS=9HZ>%@?0H^3}f=#D(CT%57vp%47CbLOjLMdC(Ep^k;EG!obwaaoacJe#e54b zzYEPoLXK5o_g~iv(zA;vd4;r}qElQefSC9Y^wsvTM&Y+pC!r4L`Ds|984~vHh~q{< zbgzcoNEqgqDVH8=YQMoqk&?zvj}473UQj=~zT%x%uA#D~9!;fBE8nFVWv^yx5X&Hp zhtca{+{+2i%I`(XbfH90j>LI^de1UAi!ngCEtlZyc=$l#)&KZj2WCVspnvB~ul7wA zVXYkI{q=j;1N3<)n${j&C+m!C>hnP2+$^!&Yw%>3;5mB0S1o>X$Fka^lM|cj zfFlCN0z{U$8kGHe!0U0Php-J3w>c9&j~j${+Zg&%rAhudrcnGoXL0}P7KMF)l5ugK zUDFb*t)=Rvf9@Py^Wqr{=lwgp1z&Npa?%tX9gw?;gPZmz@mIPAv0vFUL8xM=$>TXn z^}7Dt%UU@{8`L3Y2AmsA%eWhegcoGSnb1J#SowYOnnI=`XDwMMn(}8LV>B0c6Qe2% z1ebxTsU8O<;+eP)_38wPn}+Y)ARx!)cDl&x<6fc*WadB>fQnK-S{I1q(BAUywA~1Y z)WEI-Ck~4U&alZ|E8Wm!G#Q!7JP$)zFys|Wt_Q$lY@a;RE_5&sH1)NNT0sB#*w)P}w*;bSyU-sGCTbSDBbHSPL zH>kf`%d_HlQi?L=KAf9gLh9h|K7luf;d#!qSW(i{5zrE@9UnaC%e1w7r23WPi6~;; zfP$aA#Nh{XhPDgnmJ}d>D=;CNfi1?LFPU(8u+3e?IE_yuZY;4NcE?P?MCsp67k_$j z>)AJdu?}Q=OElY-^o)v-(Vu-RPCoJbfBi*!fK$lt3&q~2R?nX?AnM5%nL_qb@3tre}cNstSihZl2t39<(eLU0(Ug&;Tdysg(sUk+Y0KMmV}L=WSICL7BuWC2iA zy9OEM!0Od+aRi`^^aVBH!AjSI;eIk$|81^8)q9TaIu^ISCWqxMlPDQa+8i<3^9|K_ z0PVhqwga(IWc(mUX_K3LuJEV6eclyOn9p*59fIiO>}4xwBICXWX*pNNifG)P`9$uU0r3iv+^NAZch+Ny_$?>pC1sIePq+7a}M4vyP~YkcsNat{odhX?&M6?7gNXRG}(b zF&Z0l^!PLcLJMkM>`T-NUe|XVvhqeSbMK zdVnfec%9s})zPUT%5U9Cf)XprCa2l2g#`W~Jjc5g)1C$A;cKEuYA3duK3~vAj4kl{ z)3j0(GE%XXP-C9B&6)7|ZDS_ywqZz+b?c)3qM`|UK-5BtRi!PrwAq*<9QjOZYxza1 zoJ05fLH$V@F-_RTT57~#ojYVv{k&b$UXPf@o0aVK-mUWA6*u1rItc!ANZ6HNsQ;tCzMi5?PFf5XpJY_) z6?nB#@N0em1A`0mg0$h2PQp6pdGA5N&QGx|Pj5SnJPr9Y%wGHla&fCq0jqbG*NPZ+k#6^qLV}|64cVr*SUsuvbTk zzDJ&sQ;i1PKAIG+fr5pG(%}Ni#LM@vTvQ{9OkXBb=5DTEdWlbr9nF28LAKxKRaOD#=>bmoc4% ztYvO7n7Kj#P9NIb)O1Rs={h8jP%v?B!EhYR^(Wnz-+EUQ^_V8Mof@Difx3BTHOyG@ z#<0@#;=n-YXRjqZKZgON#(UznmCqx&kv*=Es#pCx=~PJ_kPIdk46_a)PUJY}%f({LFHe=>`U)1`1rGIGAkZ~FC8yhzie^39fRHvk zXT#3mNHFr$q~bp;rpX+E%U;cbW=Eq$xL9Z#fOM`$*ny?9Y#eZyM5Afy9W0sYNm6x= z1%8s=@YA2F*0hCFE|@;2d19!AKG>`v+z9EPneewC&2#z=npmXCGMccXho|T189d$* ztoE!c8Rp;Ex-|qZ6mV!ZUOc>WyvmVocR_^7b4Kpz<+UfuuC?GS3DtEUM?uABaTP0Y zI3zQP2oHT&>o{?3bic91UJ!|N9gh#cwrW*5VS18>zWImW9rRZD|5P-S8^#7-3!Fs{ zVmSLclCMw0Bi@Js_FE&R#3K_)S==I^uM_|yeg3!gNi}N0uIgK1Z0RGUF&wi!lI3e1_tzq z(`jrzLGVqDgW58Kh7ZRVW)mS@Rq(vp!`|_MKpjf3RZtiy=%aAOSSV%PGvHf4wUZ&{hcoKp1j%{udx|zdd}t=J~3~_ z5WX&Z71P2kGeI}}DNN@FO1l2@%@6#0u^lzKGeS+%Bu1S1#v4ap!nWBlDoHJ7T5iO& zU393$;1nNiY&^+8(tCvMDbBaNWDdWq1f%WuiNsm0bIf%}=D(;`s{jB%07*naR9%N| z7f{xm$f4L6_jdAP=6CNVn|NMcf%|7q@O;N+LTU^8v9eGJ^qorN*P}y6o+x>oQcwsO zt6N$q(&7E(4D115I2({G$5>4DHQ5B%@Jt8CG@vk3!qn||$V)t+s9KN9$Clcwn-m)E zbB5~f&8g-zxFrV#19)zREP;_;fI=D??}a%zvzB*le1TGsb<*Qp`5qh7%)m-q6Wm-~F_^GUfNqTB;d4GucMF#io%iXee$KdGDcKbyK8RX8;_ zrM_xEa3SL_W~Iw$Jg`p6C(}fNk8G_e+U&nz!ftycX?8A^dV>UmWdlheD9fiUv^)|M z#_8b!l2(|RE5T|8e7~7sII%aUlCI`Z{UOa@x-R_8=Xr zoDXZeeJrL)4HNyI8jbUTO~yz3E9Zjf_tZ$U^$0gYZl1Yh{(RJdyk*xYsrlu1-u-}3 zVxF)V!^;?~*Ak)NVX+kNTLW45fUc@?Q&STTMFi zi$vQrc+ZQlnTx{A!28o^5dQM7KltG0O+7uG)Ob^`@~CZZzK|i>efONN+lgd^3=B9e6MgN3~Uc(48$F}9er30 z!PB+Sk{gGXdEE||W|_@qRd_erMEj+DOvPgS;5Y{V4~7TA#OkS-+&e5|p^<$Z9Vq0k z%ASX=1OXlf7LFU~A3Ns6-D!I_4rZqVyV17!rrY*o@adw159J=76=vD($52O26usM5 zFy}&}ZA_l2NTM@}+v9}=1+uNJytl|CT4C?_&V5=b>xDWb?KQ=kLqnOW| z&<6ZCo~Dm!CUarIWcT?TOrLnLLnYPKWcKXY`YQvepTnW~G9dI%BB^l<;jZst`-kx^ zQYYe!Ti&(tEsCO-l&tF{je#>o;AKVJDaBF{JCz_{*^f%3U0ZkW%w68zKK`Q9UI>}~ zK#3?xup795%lraJW`+<%*I7gUO;;z;THkV7%AH2T1s}Tg?&}nXYd`pPe+8iDJuc2( z0#7WdYNer6KCGfdw!ExrIjaeC`js#0|3U~(d~?mHGcw%N{Q?f@K%st9CEZ5d9g=yrbh z#Z&7+199RyVp3!|Z`)VHaPKMRitATY`RRaArU0E0X>^D@7?N3?_I@A!m9IS%a0X39 z1HP9fs%DNv>g!JmonX7STd202xiiMrpky0krd@*T9LKEYr2eEk(!m@3@GZpI&o8lL z>uo>y=}q`L;q&k}#5FP#?_=B{y9eZgJSfhs8d=%6DD&b-A>&DooUy#WE1~3nGVjBgaJlc=_@)wx(V)9_0Ck>&Dq}Fs z(MW0k-c1Lp=gm7BR8`}jqEYp+X!}WC&(Gk&)=N4PLV*Vh@%}vMt*1j$;BHLYHB{Pm zL4}Y5axiO8RGLSX<%8>1c=#UsLkI4 z@BP(@N(}Tyr5(YUyk;!-3BGigSbOzqc3SD!$nhoD-!<$K2CJ9ec-PRMuD>O(c-&L~ zR0ZL_B}6csq*CfEa4D=<(N2wF8H(m^ZuU9^)ibp=K;V3>03|P(csIy8%PC4C2lTIV{M(%+21L!{WA6e7hf|i|I-%_77QO(F$hh1ER#>C$;u!u`@0@9W^3d(E- zcLV0v0?Yc}EoBdUBujD7s0+q0D{7ZV9iRO&&US+u*8QYkJ7_JvX&1^rHcQM41 z+^Ad2ac@^)kTo?OiBJ~8ZUwWziA)^$ykybi0T;4$0cK_|vGAtG5BUCvGo}a16>1BY zF&SRzdF_p14LS>wug4+Qd3_KnVG0Us>=Gn?sSchc#P6R$!;jF$Q>O{Dzo!LfAPYIg zuj1`XQ&=h?lRUXIwc|yW@@+xyNtiYB}@8{rIL$k8iU`nV%hJNWchZ{C42!e zfrl*z^Cao_7uzQ&@qX>>v#IpKWiaFn>e9NzY1OHvCqf6KfGqVYiNsD*6H|h1eG_bC zj{upw197E=cuQCNMRqnMfxhhbR8d1Rcv8~=EMz4}u7TOskl2=jZq7r*b)PAkS6Hk& z38m(x1x7gLE-4EXw6br*`ao83g1fLMa?K6&c&9ZXfvWbVwd4 zrL$N^Szqc%QB`=SDEI+I6M4=&6soQ+hf>A{gTZx3l(i8Lb9PUUuszu%MRFacV_pqH z2|*^a>)AY+2IZp(OWxLxGbZx`P~}owuir3$4+cL53|0hQ<9x<2Y9gy?Saz-X&_fS( z&$t<~bz}WcXB(G)@hewCpz;D>fuGH1i_fpD4UA)%bsuzyM^l_zb`PHwIN`N7E?nuV z#5(rStc_qx5lLe4xS2>QLK=sXGkTiNbRS#y{wzw5T_J)F#Y+~T=yL$*ABA#_3lx)wT@K+q9K49yvd!p@a}l!)n7oHQvEj9{9J^b(gj)hZ|?%MM^>@kTn9-0H59 zH^pP=7aT74e=&yotYwuBKHt};9qH|rZvN1R)TRjopVT_HRUq6yA-Q2g;^(U?riMFl zZ^qAYO;oonbGeExmrF_z`4cd(kBCJ7R>?B{05r%SLFDv;$T8cIEk6KyD@wN0 zhNi=Q-Eb|oO9g{nIL3z130{_pLToqYDwVtiw|8V135 zKmgS-a86+SDW#M+JUtjZ$r~9i zXzd`%-HW8u*@zD>7v1v9Oh$ixPRJbx4t3m{s+?*tS;B0bxdN414U~V^=@0Y|W^8>& z*8o@+OYFgctd|qz3tGyTUX(wZ!j72@#-TT$LR}Bk4py( zSL3u5(5Q$>Lg7zp$vNQUnOLS2AFOo+argoP8}c5VgIJ@*Bsh_GF{-|uuzVvB2DNOy z@YIJEG*FytdEp!)*oV|U+vn?PlBA)7yLKFZN#^q#QYp6HFys$Jqgl)6>ihXGUQB)c z>g8IhzFll!^y@(=-PEXNj!bjA^~0kDm&uUZfL!Pj8a_Cn9q*Uk0Ks&}NI{q#aFo5} zxFH8nQE>(9WTwgi{#bWb^=EAbq&yO&gr(AG0YGfo9r8o}m=%Ll4wXjZv%Mz<2nyeG zv(la5fcOB^1b$M8E5DysjoUW1(BGTq&LwjKj>7!XmYuH$U`x!uwy4Lh{wo!LA)6GpxY4r zyw(X3NRe~D7IJY94(5lp(K`H-_rO75&WXu4;$TSTShA|B0?B%5wbvUiU|XBygc_3YQfX<&q-HU7#103*8Rqr2&Vq zq=om7Pt)ogUWgBJA3+gGCkS^QrIJXrpXfrp)Oz04o*&Mx+y~SJT;Z}e>@H<{c*D3? zRQ0#+v2g*c+O{?p4n~PO5zJclfWB=OO)MYaySz2-OOD|EzX|oM=LEQIr%r zAN^t8<*^SV6!JKNJ%g3Ply^Af`#-%0J;3l>HRxH3B4%%oO%~vN_Q&u=ywxL z_K(FkUO0Hu(zX<>s73SWvx4cBbq*?2pA^jO>lXPvCoy?Y2AZ8=^{&$DefzgiHCc>*h}H*~(5Eh$NTif{i&XD8d__XpK*xU}E| zpYQmEY#k`oYpnKnyv@9 znPq;7ec~R@`tZUU|8eXyeoR{UP?e!-5^p5~C-+0;Z^~nF#jTmC3B{P|$`p1kgObIg z-9wE`!K)mZzC|e?}R?pPE-ny<_!Uy2*#s~mQ+l!Dq`BY+bak$jQ-QX zAbD3%=6;=0OH~fR`FyEV`Uo`8v%odH2wls2MBCbpSZg~JGyhR-iR_E?q&*sMf1U@t z0f=H+B{4&_>||auPzcT0dCi1=1Unscn{UdDt`?Jn8!2lTy^hz06Du5y{0+$D{n8l; z{t~IOanG|Cp!E?a`xMmefOAkk0?v&A8keQ-z+;$hU^HN=U}K&5myHpwB&0YeOzoC< zQN0-=n6HnH&T;DeWx$dd>6G%=MKeN!Zw!pyBFR!4W9e?x2fM&E;X}ePh{{JOE@^{o z(f-V$=D;Zxb(KD+>*xCti)CK=jisrd8<`S*dG%OPOl2DiLxYaom5N?C-gT(3t*kj% z`SJbr8PfwV4Q0;i9xYvg^2SF{#gd8 z!E!yKU~hBjs1n9G@={5YHO~{MVpgRbQOt>&5@SyVePmEDNe&NRxlI$dceqqh*O_}wPI_tXtmyWM zzn$ry>A+U$=QF*n@3wu(QQwu;{_(7u z*h`|V|Lwl-)dr`<_*NR9EAibv7uTt1Rx~6AYmhz9Pb^x%q&tOV^LZZDUV?Pe5k_D~ z03Uc5-X_Ai%opLGKB?vNB|97*e{q@vfeikgIK>I+kn(35cW}ZjqGZ2D8j+p}%UbGL z);jt(#q&S)o8*aPk!!FeGYI6U>?Be$ZIpV=q&cv3p117f6;-A*eU?t#i9(j!7lJQzMrhz|4mmDvH?UTRVSrJX=`lJsZDQ_gZ!e)T z?&#)9Y@9NyVPv2S{tG`K$YSPSGq$~!PSeMi_9mjNCxMPNK}v&gQul%pjk^$i z1#}_%((LBuaf3a+^MnuQ-+8B}Fj{Ct_@rZ;V*=wa_!-Kvy2_?)5h@4dCrt}ad_!js zZEFcL8+SR@*~v_vMOF5DQ;4*NMD+tvB4NO^&jpkaH0f;U-2Qm;hBT-80|FvBhQTYS zD|CCRd0r1V4R*QUPQbv2#|P}n@!n}oLqO4U&hajr@}H;l*E{X^ZhxbR(--@S5#U%; zxD>m6f}`=^$62B2ZOlOMi6(_l9#bZ2z&AHk5MWg_Nz6I+b(7rZT!PRXaWD@L<@AtC z5l!6iI~V^gnQyxS#`9?a(# z0~U7=lrq0$s>Ti?avr}d^(ndny-@BvP;ov2z6VWoNFksNib{I0^YXcKPa?9ZwEcg& zrq{S?)lE_{z&J0SSvNitpq}QaC-M{w@**XzU4C9ma4U{^lHsnLgF=4{);b5`o=aIa z^ONHVZ}H|u?;JX)?E61mKi8AI$}4gAYE&i&ir0vE02ya(wHU4sywGt}I}Mt;nPL$% zw*>Zl3{*Gb&EA>m9=i0(^IIv^C)@Uk+nOO+Z@N?Qe99A4>-zTKncD#6KAjEl` zOC5r~{a-e3PE^#8_kr62z-dp(kPR|;B(r$&V&lNbh)aw_bQ-%KJI0?iB(x15{`6hG zToA};O;gSdRXn~Ed+zV;4Gi1PYl-RHqoeS%+R%H_V3v7s|Lf^W8z#2%ulaK)!h4!r zjq6>yEEhy|FBo;_2He~Xi4{5=ikZd`n9&oP zdTLZxj~01YKA#j%>#{fCl?$UO+4OliJ_|v1pR33xi|LByTjhc;{@CrVl#`nRbU@vM zJ9oZBPO!s~L7%V1VcN6dgdZ{88oK=L4KF>8UuNn{tgr%Thiy(dvZNtYOh1>+?!VOM z8!zIhobT<{l#rc%kHL@*lI8n8c{|A7Z%0ARzX0ax0O>7%athq>_G8o_) z#6fIVclgm`ebh`o-joZH##mxii@Go?CLLmWfn@!TRo};`T{Y3IFWc0$39vytj7gZ zhNKmDonM>fv<0!mNDY7vvLBy*_KP^gIErR+-~2WHT@oWsO*WT;a;h4omcGzZ?_;=* zL6`*c-0-k-MyX_OFBYwnWkVb=WdK^x+m zXIg)pZsUu@dsoqp&d3$C!s9+~bdYS?M99pA*8mecpRt&Epa}eVQ6Sri7~EgTcMe`g zAmn>uS~~!-=kg1-D_)3V`1%O4(jh*VI_|2LA@=Aw_E<;9K4=h?UmB6ogQhK7hO872 zAh77mvHYelo+~@puL2Ub81Egf4X+=^>WsmU$`a`{4Y>#S&Je)+ew9_8oOCnBy|*9Y zh44SJf&Ww~q}@N);W^Y4P_*X`TY*-I`TluJA=J0ldbWG;ml=b<618HhfaB%WjQ*f3 zaxu#?TR}=5H8`fqWg0tBhr76t%rjnIfF0$b?ZMR#fa@~q<2oINwa_Ih5rHts&Ds6{ zW(+Q#Kb%$79+%|n<;=o^Y>8DNWj~r4;WNaSHM`O1s9v&%z!!1F6($!7g}9`vUQ%N* z&!`|sz*mpLOzB$(QuVEuTvDgyZSMe%>(I=Q%jd2IVxnH~`U8+<@p5jd2*UM2(I;%* zo5;Pk_4twQF%~eA2b%*t$QmT@f)~1{Q0^W&6(q94FGbaaAJe;shdaCTq^5>`{kDr7 z6h}}9y+z>+R?$#q#E@7it~y`n&u+uOke(2R7~h{7qj-NZ43v?dpEf(Bs|LR_QB3QQ zGpMPl8EzUY-l^>HdP8{l!XEM`j!hlXdD4y~-7$~{b?C$nfj&MAkJ#_x7#9ebfMj8l z(0ALG)3k@L9m_{h`oSrY@L|m|K8IKKLnzyRU4YwED4IFZFF*P7Jw4Cg2#qjWBEDhY zzTwb}8C$KCKA-jS3qOAL2ezOcX~y8@qLe+t=s=`60$$L;+zg8LO`OG7l?2xur@$R8 zGG>c29Dtgx`5Gz;cS2LPYz)$aql=-IayzIj_NsVn!z^M1LEXhjf-OZN>3j8F?}3Up*BGh^BW7C2r89XF3fXP9+!D4m^UIi4 zE(Nhf0<*FqWIyrF*m*66V< zuGuK%o-VQOzM#+D403VFoih;UhUS}K^&(lQ7E2aFmX2foQfYvR7fS}Orkf2l)-$b% z#MgIN&8yqeqg|sybD)U~hhm;EKUJ7&Y7)G8anbE}IiX|biDL%A>G`l=OGxdBRXWjr zkEilAg%d6|H0F9%AoUVK39ijJfcAjII|qoGX@SiMc_}-90$?}#4ZeIOobo45n`po^F(F<=NFKAX` zj%DdGifKS;2X+dguMD1dDfQY;DyZ24H4(@vEs|t$6%ZlKcDEZ?8xg0(>((Mkb95F;p<3jj8e zwKZj@H6x0F{>1)tuz9&F{s!chERZ`XhEw=wHdpkcIPY`7E3c~ydyGw>l4wULj3Pns z{3(&8?EpmtgP`a7YguUG{Ec+_by?-7Vz^A}hxevPwB0_Y2rfy|&*LCB zt`ePch?I>lO?oQV z#pX3e#}n(+m<|;r-?Q7>BN~j3$nfySEWzhTB`y}fE-n;#ez9&_2|UQ(MyPi?CUF!o zP{VOjqr&L(QEvPJaDg_7gxl{BJe647#M6_Dubfh6=*Bgy%ESYb2!}}T_lUv*86~n_ ziS;qU@L}wLqE~G`ssNfyx4BK$`299-9RY((7L{9#sRH}DlV{@q$&7l!;?H=l3M4UV zlFbhMP}d{*?P5`1(v>~x4e54Ht!F$LE8ke_6U~I=dCG|87Y`+;wp`i}Fo&}NznAmn z%#6>?x3~c)o)Paz|T)8OHt7&bjG}s-zYV zI$SNORTL1gC-%dO~k{Fc7iF*1!`d>YJRZA zUq+u)_M>aVAwCPI)>)i*Az1dp7pu}@=Olr8_Aa3}H;eGoyka_bAx-IqA5f+GL zZRX`g;E>Mmo9~ z4{ke-1@Tt*sAerhN&DaDs(i^X34|b}n&NchndMDQQa+ZQjpavBghK^pM(AbZ`D5M~ z%FO`VVc(kBRe6vt{VqVnJp77Jo0^dTz3oX!-7~GLPP_4?YPCCt^HXzHNqTW0*Zpc! z(`b7v_atjrcOeu&rOR(NbmmYZcl_AOnwh6OJmFwn6+E7)c=?>7ZdY+mApwtNmx3fi zJRY~}Bxwrd&#GZ)fIqRj9zJ#Jsr-ezpy*_8+uQ-W0I6@qN7sPnFxFIp~{ z4MNV5)x8oUAgY#BW+9W(L~nfnVoF!VOhEwhHeJh&19x`7F-K z^rIQW2x-Rg3(<8UgYkA0RK)9m4lt$F@Gi6;rmCJe7>a@(#X* zaVi5ZvLR0%MGaqq9djaF^TDi@`SnKIexe;V2}#o3Bv4a)6@?%Owb*+Tj)mX`ih?2T zH+nif&U%Jpk1y2lVzm4cU}#Mq-Fg5&ym-fDm#N6u??Yi-%2Tg`OqvGfD3j!ok@n-nW-iy}fA*SL7sA+A^&=zGG;}At^}0 zf?E2^Tb|2QV#Sr~`)gZEV9PQXqacADsi@HigNMxYb1m@YsBo+dLCiO4m=SVQQ7F)S z6mP^c8wUqF+oRFMCK`egb4c>rG*os*FQ?V`(gX=x-Mm~iwNJ8)P>qDzZehAOf11i~)CLx}g4`8}qw zkBO{9(O3m#%*-7~IITdKrP?epe2X7h_9nl&C!OD6AQS=v>_Z&1N=lmMTbSiKW!pgR z7a+d<1boOw_|6W{&MfZTvgJ=?=~82HFbF<;z#0HgWALzV|NNIP0vj4f3~OU98ZF1( zD?Nz&62`s4waM2)7XAjb-G%%1I`FoXsNRrAlSEo%Dh@C@r9 z$P95!?wh?`qq}x4iYjgE*E8Dk<=p{RGI=6=7l#T1NPeqUD{jEK=`3X2`?azHqB*JP zPH5A|5l2Z6<+LdgM(Ioms>~<#`L$E#8jMWgWe4%E{CrUF>G5N+d4i6V9M2YOTRly` zeRGHj_?%Y*0SV`u+2J2jqQtc81BuBqHV7xVmZE0CF#gfl%L5)pD(*Fk>6DsnSAx9)%YUO)(pJvl@Osk%Gjt; z5}1!UbaBfu%TOG;R4TEh1g63rhZ2KBYoi#nCN1Tdn&lr71eaOLy`QpwVNw!`HYy;g0|VvcR>>3PNDjI2RI z8J?kRWvKDs@~mn0VsuFwpz_625`~@h!l8|VG=#%;N&4jA!Rux<;~(IDy`rd0*5ihU zio~U5gWHL<6-Ko?4{v`W=U%w_XvC8f5FLe_4;c}i==-syP_%~}0>#kU)gs4+SV5vC z#N!!qnJ*6LrYng+Yy<6o96PAETqnGHoUC%3V|T9gq>bz{gkT{(Qrg)*WKG*%#yw%RsaQ+B000NnXq+kMF%=QETxE zx&b!EQb2Xue?`3J^L2W@8ppp8`PObErezj@eLWWdM2|VgQK2%mVGO4jQ%dZHufltJ5e_O zOCW^j;(7iuf+mWy+Ik3sWt&*!Ev>2PH|y4sBWu^zrI3tsW*Qp!ZTmDAMbF^5)Zt;% zwi66IdD^!d`;&E5-D;`AJB^=^Ca`{_3G9tBBVFTV;cK%(KSEB5YK0oVhC<!}X~Xve@B9gtKa5#t*g&9H09OF*V?44I z-NrNhGBE`^O$!Br*ZOML;H{5g3imLpbJYg1{{^GhCj`+QG8nUgwIvUrANR~y^!9MB zqe03ScSDlDY4p^q~^SYYgv8D*o==7AEIwunH$n{|T^2@Rf6HUl-{?-7> z57uDn?uFNM3u8N%+k$#zii7P@9WBQ<#quMnUQ$qA`*DGH9-O;i5%qk^%a$$u4ztc9 zr({)(Xn-esH1U$Doa~Thdze;%{r;9Md%uJVzK`9$)=@AsH^Mx%NiZ%p!V)58#EfP6 z;hAO$YyH;Y^=>67FhQJkE?!(PdT}H0UXFra;vf<*PNZ3`fmH+WgY467?(gBfCq%<= zn;d^NB3Yk?4;MDHjKoWhVQiaadF~IaNj5C3ahD-++hUnMgm%l;#%m!yAAVc z*~3enC*qrxKBDWGo|}zKax;>3uO@S4y3KLJOn--=1(}ZNh3C2l4%jldpdNwYYqWj) zIK)foCgo+a;iX@q59eaikE&?2k~7~7n60N6j>}qt*_|T=sAbs8AV&{oB5Rg^(FtMA zGG~a>e?2<(OAz*?{jMW8gf6AbdAKa_$1@m~5x1$98EXTrl04BGxJsr_!&+<$0*PSE zvmOJID~Q6DYM}OhAshDd-YLF)=BN@+r!pyyWiQlqk^+JPXh~*KQDM7-OFFxM-|MXt zy^Zs@Q7h>8u=ytr^&jMX+_5q4f$}B(et0-y>dYOvD*2IhgmkPO^Ss+4-mXIfx$oN& zY04AMg)H*Z`!;MCm~-K($B4kS$a3&(ff(CRX8xwBbC-b6V~}$rc&C#(ge`WIIHLv6 z2nKaNfM<(G9ivDl$R|~<^RH>GgP#i%tRt+h&+bH7QE2{r7cfgP3^tOc8^iMOaphkT zI)c;HaaKc14%{KjkWgL%xh|T7J0*{Fre6DLGrmE0xE=%0N|_gcG%y$8`DehD3*4g6 z46mjiqd5A&gkRt|vI^en+jYpG5{KG^)C7>;j|?DsIf1zy3Jf!Q2sze-9l~vG;G&hU z0Us;1xvAj+$P>4^?G2n7WH@0Vl2K5>!HdIjQN+tu;fA2df{b#e*$*nSVa;Zjv*7Vf zazofZibKE>Ho4E{L~gc2cZP{*_*sJuSuz6^WxEEx$FcVM>33nXQdhc@sqxfALCRAH z2wW>-bwOyv2|x-A!yx^})WxTT!J{R9>dZmFodBxfO7Nck6G^W1ZU@(!OPjNK2fq>? zE|fcLR>|c$V$*5|o8cMq!|CH1CrpQdsDh`AXUuwy)j*7ClwR^Q1~cV`;y;lShA^}n zFeZ3B?Wm!aaR0pJpD$?ir7;cO0WaTN6n)F9U)EBS*%i-GPnx<0PQ=6`kQI`)(z&>k z_+){*4g*#cw+HA*cF?ejn|8Ojjh4zu$JS`ga_|m8nL>C$HTz*45ptinaQx4WbpE#` zhs-$`@)#`MEGQ7y6fJKVt2=Si$)8!4pic3`0zQ70OmLMe-_teEF{muVUB$&P0+ITA z2-DI8D<%cn(D*Mvl{kPY0R;1`ZtDAkfjNl#6#~+w8UbBMTG;{uFg;z^h5Dp4Q@*Tq z!2(sY13bgOt~-i<06al=hiaJONW#jrhKnok&_1;O7emhFS7pJ(#-YQ0A?bR`V3~g@ zXvM*rnf@j)+5IiU8qEkD4T5RT<#4*0LdpJ*TON97!~fy#O#tjF%e(QjpL5UMx4Cm? z%VaW1CX-}H7_yOs3=o2Wh=2rCM6oI&h@utS+S-uXYQI{vfLNg_Zq#aIQI@a-G9iIL zlF6RQHkr)6+&2pN zb%9ZDwbRB6?W3c;G`tw(TF?!%1;tD8>@opcJ54Hiw8F0pzrw58SmBt%RHbo|>TF2o zsggq)v^X&(l+twonUiN3mDEy{;lv|QMqZIAJ)kjKe>3IyUn78U{qJb3;O=7S6s8$< z@JDyuRr=CD|D*--#DVz@R$0-gShB>=j{t9fUHe))n45*wNN$<9rSCZ8dHKa3P582m zGzYx9N3k-aNF#GQ=CT7&v0=t2{e-1$eFjyU3BdhWIzEtkw?G%UJ2uP>EO`{CGj5eu zBk++%fncY_p&^>8tD_`NhVQ{}0E-!d{CbU$ag+U=67PbRlh7^wS-^$z$nmd6fTqsW zjcSSK?C{cGfMLFzGfW-M`qPeS{z@P!)!gEl&#thYZbfC`D zOMHC$OUeicw+L<%)o-XE<#I^)o@ijkmYpvRhF4tnO$jzG%Y_CKr+WtKT7r)cxqXFY z)A%vKVl%ENtOm;fjEhu|xA7zrTxnKiP*%Q}d{vUs7h~xN&d-KDQc~!Ij zmZ#i@i&XK?fn8jW8}@D4!9OPy=&GWnKL9KE>sMcK?LJx2F3eKKZMg4CafLRM6IU}u zU4HUxau<$YcK<-oifSmt^zPoGwzf_r17Pukn@t|wg3BP|XEPvXHzyK5PL4+{e@%@* z<&1xn>~yB!@{Mq*!jp`y)-${iC>cE5?8JtcXh`Uj1XyL; z^X2s-FO@;IDFu=yol&ff_QYPvf=$Z8ie2opnh0S z5SF7D5S8;K3rPp?G(a6TRj9 zDYLzDGQ{L2zT3D_-8-Iv+XSI1*77=3$&GCg7yZxsh=}!@7A3?PxKglPhs`fv04j(# zr=^wBvsZM$Y(;Dn1Eju`ec2_Hr_Jktk3RL*a=tC_Sady`l>OmLif z#ggi&2=J}&DN;E>IRee7sErn<3lQ{i7`|NM3xTuH;^DXGhRQw;obo6zY-b^myD|e~ zr`NVO5wpJ1<*8RwFqR{q031cst20_!5WJ%(xGh}XkWa|dIr{ha-50O;kjZb*?gs%0 zvtSv>jBJJ=01;$+E4}kYaA|}+lF+F}3xsPoHl!W#RSQqUmGdzy+V#4j-7{-d{dcyF zmijppGf$>HtZ2Ip_iZ+Mmj*ZJ&r7j^6YxWo1-?YH{Uohel+EG#9_Vz_e4Z7b_$xik zURJX1JJ`K9v3kaOK=6ADNLKhc1oCb?$Od4iXTe>z$|W|xiAyL8Ut9a_D>Q`YZ5WYVT;1fv4IJg4q`I?4Qyo?{!SjMJZ-Jn5{W zU7}uP)33Y#{tPq~vtzQ4q%V`DnBE~k(HCavr@pijkNzg`TkDymdN;JmSKZ^|60+sy z!_nlFN3*Z~REhWX|LkY#^k+zp`+m3jYFF`eQT4cOVhieRgOiY+Wu%8KDooaBm;|cQ zEQ!KDm=^bv!iWmL$Svx z1pJ{Pu1utJ2RF8Q&(V6x4P*slsVvBLv%n`=2i<75SorIh0nQ*eJ+p9YN8^+h@9X*flGTb3zHEWZ)q~^9kk%`Kos;yL1^4Z$-gwHx~LA4|evY;vJ11 z;xD!k@sA+08A$_}u?Brq)Qexza#}nt*mS4pQ7;S=6St|n2$U~k+CN0|4qUM0QWZ6n zXvWxn0EZxYxg#LXRPyOLED9BEyyK1+@YP%Qm9xef)DA)_tz>C5YQ$|Ma;$6?_9iK} z-NRpL+1R5cB{cv5KmbWZK~(Bha`hqjI$vMc-k#q*8owXj4`f(d$e?2{GX*Q;)73qo z4AwZ4oe$q_I}#S+h$}pUg42(5w6^9+H;LusTfR0A%LX75w!I&St3zj#@kTq7kE8k~ z(kqlODQ>~hOC-iBEL=}K1Qd1U1#N}rPE*@CC$+Os>_cqO;}*3%n|bk3g<65pgSLJ9 zb~dZBH-PZ{gFrl_p|RF6DYIqEOI!95p^DR~K2y^3>jh4{E6=7= zzv;F;*bS2TUM|$+<^ApONcq9~QF!ss?mqbJk%2Q;FKkGbJNaMyL&n`Jqp6>PPX(|! z8hp@v8a@eYZHi??zkW&sd`)5Xx`j43f8E`ihHxn;;#JB)PK)Js= zKd$K9UQB6h=YIYF_NkxuFVR4{EXb}x1Xm6{w+n%j$1|R4fKiNJSl>5cnp=12~*W(ETTWyyBGNg^a#W) z@)k@{&~#F;Y)UwieTXJOj+M?NNZH#0zJiiW`J5slwtTCRKFsyk)>eg`i>|x<&jVyX z@+&$<{K4SAgfVKEwQjL)>iAf|Na=DRE`bHT1dEguhrIM_do_-y zV+bZ8S&-sNAPy;xj&iF(p2M(`teI+k*e=XP`rlGjGnf3dudjTMF#n_Qcb2t8NI=J4 zvlMNg69y*IlOh!!(6x6Jyrj?ktOZr@sV>8m>?;+s$B7wCn5RHUU&SD88!R)?Y&u=O zK60JNHgW>A1*aUQJ069m(~EuM$(EP;Vl5=VmC({lBuV%ds#I*oF*ob=EoD1;DC|F7 zWX(-TsQD47aE_p#ZkA)OfU9UdTmrT5-ycSF|9+KH{{Fcd-&A@qHNV4#&fkPZ(+&jk z7dSz95NrV72My=99F%g8sg&-BW$9Z)(fTr2&lVSv?MAK(=e9^P#kvrczqYY4bye6i zu&be=Z@TtJl6p+Wcn$ zz+YqM*m}f0wlab@dhfAr&`42>aXm$iQUGzIRH8M5e0Vj-S?xB4-I}#hFJ@-QhXOM9 z3n0u0*6{L@KF*Ijsut2B{Vm|$@4|p-hYRfnplZIS%F+i3ypsHNqHw_PddC+&*PC4U z;z+R`i`h8=PMuL=z?6ecpB|74TG={XIX93y5g9(hGNqT0W{)Z<)Pf_F;ysV#E_p=M z#(U?Zau(CZa{N+W(=LI#t~8xchm+(S=xCoY74s`Dk=lg&+>=Qu_o0B*KgbgE1Y#pH z1s6;CVCUgKe-yWa$Wa?CgIf=1*{jQ!uYLU4Bk7}8FLakp_BZAQ#^EQ8Yz(x&>jamQ zOu^|<Ml8*_Wdv!guXVZ@7|8fLvZn65kEM8))67WIT}+|{4{vNIJ;1_Zme z-qLgtP$0-OD*(zY8~Q>XGQk5g`}(4xJji`)v>wcxrP78?n~0VIU#~@cq2LxG$_0R@ z#WW_08}BJ|uO`A$9N|o$BkuPQgs$$qtCdW3HZY&QxiE<(50N;Yq7G`#6f$S#{3j{9y z`-Xa1i{Y)Pfj03=WbT!Y)rd@UFy{@P zw{9>fZl2%4q%Uh}`Krj%JhW(lPRi#l3o-JJ2=y)7pYLf}yY@R;iF!&F=oVFHgZLUM zH#dOZpQL2>z)C-rB^qX>Aq@<^BxWYS(+JKQX)K0C=ca|8G_0D3|0A&vYDi*+zO z^KjMpq;DDrnC?%hZ&yz`3hJRg%fUX-m+#QhMQ3}F#{`wDKnv2^fH8tCCMhe zyzlrxep6GE@w-A1*NW~^jNo?Cj*`WG1;+xz7rj|kO3&FvX11=0k0Qq#uSdv2ZN{G~Of1~H9lT>s7^RwTQ60;OV23b9e(lT-GZ znd83UGZD%Sh5bBgq>p>XGAE&aoze{4Khx-)-o4D(lS5Qh-Fx{3tyt%ygrfwQ90F%DgiJB%}}$GE8adY4 zS%hGFSHVl}2k*5nD4E)oI83c!>8~)NHzJnOLkLVfnPlBlff~^V1VWBZV+9AYfyoj% zLiRUIb_E94E%;Rs1tzU(R)nMZ{sN=**~3+*=2;3#-0&Bxw9$s(l7Yui-j8N9H)D!( zI6)fY9MK7Ffi?#SMs#8m`btV(8?pw&>_I#;i8QOCrW`7$4;ke zc$QZffZ=pA&Gnx}(!hkDU1y~m5D>f`TBr;`e-iOLxIJ*^a9)_~1&MXC#e%tq70gFy zp0C3S_W~DkOf3SF{@HXVAV$UzbxaYXtj`Qut}2S%`eqL`qe_>L6hv+?mlV(R>q$}u zXs+K!59Cu=6!fQ{A-%3>iia}=WDtTJ-%w^47FP@EulZ1Q5q`0TdfO*pW`t|FcERG= zhts8GVz@U7H^y6TlWF(iwsP61a9IJMeN-0rkGP1+W9X|O+JWWtkRsbosHV9LWvS+X z!D$yT;7^3&t|LG*npnuO10ghGoJvVqe$ Q^3R@b2)1Zk0&5+MNyUSR-V=Sej)GD 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�{XQapLL3s@DiJOewb9vk!Lb} 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

kl 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

2-cn6gsGIE2zEilUdg z6#Xi4z))>m<@a>%o&SQFtgo#GVgR1(Z!RRfIdGpdO~9}H3ruKtBiycp2YjX^GtWzf z(d*W?2as-nR6C6QL*c zVn%7+z$P|OhhCQTXbveh8Mqx%m}!_ZXLe$8O8zGKy3XkxlxksaLjv0$)ztWh4<8;`oMSzJqRH#^;9MNP3K7i;0384`qK2ZoZzK;s zQ41}v>}YHLd3dqCsW+y3MYDGh$8moL_8DQcx(!VT^PuqCKvb2J z5+gmIC%->gU)v*HYZ*~}Pzb5Dv_V=3=BYOTz53WA#UJf)T~?LH6w|wv4(ztfesZQUEXPx~?$rff!kq7)esNBO>_T>mQHz z|7+u05vq}*s~hbIPV$>_ zICLc*63BkjdqkamTGo|+A~C)~C9?9YrvL|=xI5B|ic%vX?XI*zqYBAq?r3*|Dl6L& zdT&!X?JYLyYR2b@ZG*=*foH_uiN)=WA(zOH1AjrcB1^lcU@YaOw)*lMV>6MiAuB=m z%eK}Tm^rPf37q4UA6-$O^NRN7>VnKhGJ$l4rNM$hy;hOgr}uVu4?+0d32BxP!_iJw z2aCMUThvHw?Znbjckg37G=f9_Zr5hxA5$~FHr+afpbRwoB0km z$xwKT;2fY{L0M?@}l3xE%E3ry@6GZ3O3Z4k*Mx5pFeZ#J3G@W&JZqGJuSVpT_L z^?KGId?3^8QZ%?Iqemyad7S{?>%!8I>h8!e?3p1L-EzqI6p(98AYHf@DnV$3DB2+E z?f|LLbD}Ih>(j)B0yJ1mhr!0rj+g*at;Vq^G7X6?>dLjZ4I17y|x93?*%V53V0z+kL7=*&o7*@g`pAZnp~iDs|W9#4D& zC+M95hX(CGaQR;wUt+YdtON}t1R|9-Mvt%6IsMc%9{H?)tZ1u;eET81tLMTi87)j^7&hR;Xymy;W;f~<}rY%FGZ{Eq$YT> zK+gAm zmUUbPGW0bPZ+e+?H`apeR;va<3xd>Hl5SZKO*#Mv`5}-hbn=`~4VB;w22E6PEx4s= z`x7FDJtI@w@`24y+NsyP^UAI`$Nvjt;m<+#D!H9M;`O+o9q{bZuhsfea-=8+O0y}f%1;i8Vy(eUFPmo2 zU3s}s5$LRggOD0|Gp+}pnsHPmcU^m6j*+8Z zM`-=B#)@x%q=QsXb<%b@tz^(SsES{u=**8OsPzTxtC-f=#+W9%47{;b5o7!O)v0ae z<-ZoylKUpF#Be&so^=Ojq-TIza}^9uDBK;IFQfO*p26EYBQ7r?S|`fJeyCv>1)Aa0 z(p#sPsYLpMXwfP0SfL7c&}bBt1N|LP;vP?=={iWti0Lz+2u7)WTq7-oMAq@vs$93-oPfVp91QENTA$!x-^i^nLE|8#s=0 zV_Ia!n2d~r%PK3)1so?288R4XvO|+5Y0yYd%{miCc|0IzaXrGnI|Ux!#tz?E=ysXU zGdc&@(aqHzwex$YCCJ#wLXavBi{oz~%C8xbp7Iku`b~-`vEm8*&zuES)*Hv?e2nv& zS=AiAbaY?)Y~;c(*PstcE;OK4=u@K1?a^5053Q}UFD@*(#Ej}N$nmr5V$N4?8#vHQ zQhDaVqwhq1JOc&`NHx9-E#W&GS1nryDLWT+#b>dm~VzH4b9UEC_TI;0>8p0QvVob+;0!n1h1Cbs+;u7`75OL=6br zL$olcy4rmJ+YR;JcJKGw*0%(vPRd`70$V@i7%vUQOuj`2y&ul%pPtBBCJ1eG{YqTK z0D5>gX@wcY+e};lJhTcJ&$gJ+^$Y%o%Vbo3D3)7=wwb}m%i7w5p^6#B8C_J)uOV&k zeUtarQB%?k0y9UIwUrtd`#Kn*V}dp16q8NA5VGDS*gdIMhgWR#*H?^*`z4asRYA&7t0e-O|1i9@tF**KHHbGJ-uIK zHvN5QZekKijtRd>Y?Dk_fcyQ45`;aJ990dL} zxHoBdYdnE5afW>gPAQr!ln>xElAFC4q22YGq#_H2sRaw!{%&{ZGNcJgf~xWlPsNT( zK6faenrZUDXv5%A7g#C!JK(YB=`uYO$2AiLOZ|W^v>MMx9^inGxKZBmb#$~*85w#q zvPn*{#PFgQ=Z=_23=Nfs@w5vjamxbAx~9O-RmAPeCNz>v$9;82S#I%;ZyUP}R)(5l zbFg0~`5*|*rhUeFtyEmH!1L$IA&ZnePbbUkuFhteqw*VY>bk9#l&DWs(o!kb3y!N5 zaQrbxq8mun2P5(roF22m!&O>%lUdY7(KX& zqKRizvPv)!j{gZ-CM7&{#MIK%t?I z^B`;F9tw%-ycC*xHGAsxA{2h!zT#kn_9iaUUx=KB$>C*kYV0bAM_soy& zOI`mXs{Y`lDn#zoSPA;UFvX2AQq1^Bu8@5=l|Xi4*x2fxvZ5t0=cC`jgo{<$^Iz>RA={MW`~(hCSZ$KtHNAM*S5mLKT>>Ep7pT#^!4 zD{$J!0teNF*!j6i7U492g^N=?}Rl~#ACO}>Z-uTOy zyqn<>4mZ&Jlj#EeDwwWrQT=+K$CK%ezI_=9`5Ve4kZ=__?vrn+yYn2_R`D%LWB;|d zc6lfwNn2ep`AsFjedc%5Uy%RXLebCNF?m%qAVyU#wz)IVwF8K~m17R4w6?`!AW32c zE3cf6j!8>YkF5j8K>!iZadFcA$g>)%-_?w+`Fug3%s}D{=Y{m*udoI|4v#}r$g#$3=;!}{{LV(?kDvM^p+!y5YE2(Z&n_UI<0BlaZwf`jDB6} z_`srhOE&Gj12Qv5AFF%&_K^K_KyE1p`D5`Hw2{_^OOtD0`7kVUEf= zK15Nk2SuT$*uAvq-wID;ataIf zHJTD&S~mb&_Y;RE1dyY@46=dYa;lLS$wbKBdkCaoABC`b-BIW^byo#RsPuV_^He|| z{>f45q=>A1VvH%yIiqqtuWj{p_swS{v?)K2kpCeiuD@NJnYp?5_LA?r3h>~Pi3e&mMbg#< z)E2;{wPE1eNNyk363vF112_GtYbdI%{BWVJ*&qEntkGAZ;dvBN70@PCf0iR!9c4E6 z;X%^NQFJ3D$r=W{^0;5`wY}ta$*YA?Pl1n}kC?Fn=kp_Xu)Q6108(g8>_5UpH*>1x zCy*`O%5dxqAZ|RU+P$DqvF1l9d*YfcTC_+#^S0YIrpZRj+NP#3JSMW~lWI9U$u*Ke zPo6znU)bQwMgdqglv=wdf-Z!7{%LjCl4@Y`XAIAx&n?Ozoug##Myl@6xw#GzA1QV9=wp!Tos#)Q+F>rH7^$+D9`I z)D}>91DOu@Ur5j|L5u5wsH`r9y6+=FD*X0DczKT=@;s@10kL#6ZzQWh0Ebhg)FOI0iv&4DN#J7s_Ibno_s$(oeuH5@I0+j z|7JKIJiW}*AvyXl(bce+Mlk?I1DTbzCX2~_1WF^hZSqQrmSb{LyyTVq4L1J}7^vpM zi(ij0{p?O&|Lg13?P+(6OA9h_&w3~fdq9)74fUjD*TCx}zd3p-&(Ck~Y(KaqF4JY2 zqzvE-Kn?YUOT{lKtp#^eUk zVE*b1mn%K_c}Lh+4I+3LZiX>gbd9i8HEv#2aj>)TXIsd>Xn@_kbFhu_!SE)GBuQZ; zf17+I>X}H5kgA$plz5R8VDVjIykvblZ8;5{-V>3VfjQT})}?V!*xpv2o7+=NA@?hC z`_B1qK3AVit0cF7lD+CQFyN$MYC&6is@YuDUQ=Tv^$NlP!tzvcw#6_tn`P|D<4PJ{ z^7l3f38-;>9H>k4SXG{4N|B9gzy74{XncC|we|H)OekPI@|9`yvA;y;+1CjZu{bFtlYS^`m zF7HEE$?6zd+}h(V(lkMy3;L_-rjoB(qj|)jk`om5NZ)pF)Rul}REV%(B_DdSF4<;N zlRvfW^s{F{Ibnc>p$B5tLN<%p5*5X@695I<^#GRt?Hyk`#JKQsOU1cxmCe@8-5*SBZz6>=PWaW^`HI z91){q3VAsuvwV%PYgc4=nyKT5Hw<-07b4Ie+YG+)`3R*EvQe#_si85eJN)N=T3LzQ zsIKq%?z2jeZM_xM(ZwNV-bS8*@jxc)2?`8o(fcZ=@lu#x3`G3FQ z`Yc4p8&W0uB$l<_;6aX_{K9U@$b?aJAPuxR7C8i^Bi=j=Xqccsuu9@OGy#FJ3k2Fb zoPk@mVchtR&vt#s&b5nEQ8(mQLQE_^~NBu13JAh_Y z0x5E0;y(J|1kq3g1!SkF#FsFrSTJ|n157aGB>APg+29AGv}MH%LBnaR}S zoe`rfX66mM`@u&>bOd81QCdsYS*|aDNF~6+LZLLaHNdL%Q*ttVkKsXe77QPpDzHyL z4tzhQ$RBMk%dXG!OS#DRolP@31mO8>v|J8mcsY2AFWwx{jJc73()#aR>)RikG|rFk zS$eGeR|B=#9qeahjaj%EyTGtE20mR5`oz0asFCixJW4I^wQlnG3qSyLz28+w8I4;Y z`vWo;{Sls`|Lib3Y|Y(j?Zsz|4;I?Yp<=7i-yEUR;I-bxQ~E`K*@-gG&C|s|#kr}e z|LqO`ZIc&5k(OJKa=Bd>rD;4Xb?e=&2)peE&{hq-D&}l(w~gVU)PRD^^1P0N_2-^j zLOjx*xA9 zAwz~FjCZ$8c$c+u@*u~g=(jnk#v?GuJv+f0QbEtj&xxU(6a5j)G{EPE#u&D^D=H30 zTluvpx*_eRzA!2)qXnz?Ob&2G?A31nxbA3(4^b(7Ii4>^emTd%8(O!nX?B;Dr6rE1 z+7$+;2Q|RRF~fmE>60edDq14aSOagpHp;1$EiS#)Zl*T{SaB6t-EfNOX-LDA1p(z- zd2s)M(I8^!J>HZ3{l*rT&0(_S8hCmP+SbviMu{Y_!2NGUOOnSIliu03c}+$6kReCh z59GMpqT&d2wM}3k#{@J$=E05wYljpTo>aw0ryPY`B*3Vg_KQ=MJb0#io~71qFmp4y zNA`Doy1KNa{VJ;v+0@mQscP)`uqn5K0`F7+&PR4u?_EU*dj9Bp;SV*wWbnXYs{PZ1 z*!&?wv<6jFJP~?kREu4VSio-KS)-(gP9?-t4#~9qW;Pab$_7IAc?KAU;KDE--Y5*0 z8EKy`Qu|$@*uKufZ0ETai}={#ht?H}Ot%==KV!FXj?x#F1{F{XD31Ul71lN7;|SQW zIF0E?)GlI-4puJhT)`~t=+jc?fnn)6*~HVn;LiI7gEM#tQet34;<^-FtgsrakQP&G z<`?s!@?M4l`|DXA!#gl8g_nG`FOXH1aT7~Z=OQdl0|0y^+Net!gYo93om)I5B_&#; z7=#KC?*go?1!3M-fsVTE(+3YuRG!Ji)9%PE_}7=8#?Bi}x_S>St6Br42fd-cvI5%; z*DeIMwrR-PO;&}}Hc@g`2y99_DrmE1S#5?C(Sig0^XjkZRlO(MZDv!;Oacdc#X`l2 z8qpevcx$~PJ0UmKRhDKV=aT|&10`uJ(mGt04%q-(Ua_Mx8uWk%SMH2SsQ`PB2_qAH z44c+kgytc?b3VK&>HU!(x*q9|uLX{E0}$T_9L@s)zs=NWs+v>Tw_E+rin6q{BOdaN z4c*x(M*ayf$aNU)CZ7g*D26j_i9+kiSZu5-I6O&{@is-o78K{k0fIOPg!_X~csmCZ zZWcWLsimt}3{3h7zmZSK(A`p+SY|+`R_f9^xcxEGtEqpxGfns@GNR`FR zLH(=pdPRXJ!>cQgNmr^GcNZGF z&O|{Dvy9#aoA6!Jo{H+EqtW~K$NT+p!TFLwA=ku^+#E4n^AQebHbwlV;Uz+Az&!%V zw(iQE>kdxK%+!4OL+5B5Bo`;&n?3jYB-mov_`N8$%Q+dD6GCzQQRKbb0Kd3FvDo5TIQ+Lb zV_L{Y+jfmLo0%?4`j~^x#$65He;=E9%RS@#iiU|rABKtT8!N+%l~q+S3(_~EGctOL zgJk^cnj$#{LC%*{Izuqi`G%;pbVNaVM_o9afr95koab>UkS;XH+RddnhsiPaemww% z3lJ{7B&+gWT142+r_jYb$D{!h9TtSt*2-lI+Iy#N$mG!X%yR}C+Wyw?b-=!Zyk6yPj=VbH021q&#?V!922iEY?skN2J2{)zlbF!EV7keARJSBey6BhJVQGog@FAVB)S~U7G*TRTlML!2Q9s*{p)I4dT9 zoWo5})m`1#F~De6e~~(=?*mlqC-8MYjN;xRbc(@^1#y`z>jj2q?=`Wev@CbCFKKv5 znEq+C>ta!%?*nD|$Zj1R8HX2AIKfjf-eC|-2BYe}Vbq`&zsM}chrr9yrE%6+(AioY zG8=7g)ogFuMR*H>wzQF8Z@XE_*G4vEw#N3FEKtsM)9SHZpvj@4OSLCR6NKg;qG&?o4~ zI7Cc;to2UB&lWT^*pnn&6(EAzgj&XSR|JJ`{?S@dDo>7?+yjh6p9`)JsFrB2pz-H^ zkr&@bWcr?}vhK_{5-x|AH6Z;bZT88(kN4|wNjuc|{YISS6D}nqw|gsZy!^uO7pbX{ewCZVjMN+>r|Dhj$sUjApgk;U16RA$_HmiUcrQYB zVhr@=c-Y6ZHg=C4Iy4cIlaoL^vvJqlJ`D=Q4;ck^wxX%!CX0~?cLz6|IUwKlXPai` z73vN&i4}tj_n<-rYcs6YqM(j07g_$A)5OoA&(?r&xyOqIKW-5iD$hU%+Sz7>Sp}uv zAUe1HWD=-tf+W;uAfHS2-4e*;0x{2hAg3{V!{)j|+piw$%4Yv*C<8tU*&ujr=KWpq zmWK2D^oc+7*#Xypp($0svT0EFJ_FwGVDup@3`Rmr#t-P*BTfaNQ=1wR#j0~!Qd+MaYKk@ZqdryFW>7JDv2jFc>-i~s zK+4dJcinRj*BUWJA?t%EpP4>*NOnai7@2}dAj8BneufdkIgyMVV+U9~)c*anYRbp} z`1uGtEy?-q+tU)AIykRuG)St+@x%D(J~`g1sSv}YwXwJw=#JwZox!j(ZZ(BcQKzi( zg$GC!_jee%^JS3QYZCL(8RJIyNP4HNtW1rxhtdq`nK#R@;^0em;USqu8#!peiCriQ zWZ|h%?L3%~c4o)0BN( z-RsKItVbRXA@PsUE$DJO4~4iwoSD8*KxzUiYhhqeY2ELoPsqMb)TKVA_hUjagU>9q z{x!uIAmgkHD5oIW$Oy(F3+^2`Sgm!5CZjoJ03y9xEUbOwxPr8v+Dh`c+)*)0)8!6; z{6=Ytx+hR-tSm=qx>kg3)kE)4i}Sb~I!a zp(hd!E1Vpk4{htT8+tOxu~Rp*4#Qko05314#TbEGzWSqVf@(P8K@REscogJ{b(!@` zM$IA{v|TWe-(!0hLbeAkaYvn7$5e&L0PMZtTEsv5P~CkEUI^CcTgL zWe~bEyCjCXO&2|XAq4WI8jqv<2332~p8Ht3&GV<_ZNV~@XQ!B0u7YRvRszd|_nwiW z8vZWRmY4D@`h}VzwE)uPa(9Jq;3@M@P{p7i!{le^@J57{uzxg_Hf-$WF^+!mKs1^| zwB)LNp$RTg>`OdLq6?NBBO%bK@<-2iyWM7@)n{fxPq8fE2zJ4@Bqg^+jKU zQF{x0t+UWv@fD2RbG11}a=v?x6V)Hca1jbAeGIFz`vCd*5~-6h;G{wgP8o#BryVGU zwiT|{mY?6tt33>@(@A8ouEAZl9y}Xs(L}SLEttmf(h5SPq)2QC$V2kCiZKG)eNo_eS{_T*qB}TyxSuJvjz16pTM$icdzSpqMwcG zgKd75(M}O{Ed_4=b_l~d4Yd9xjO=T;4}+Gm<(bK2Ky3gKu)Z`^pa|>{jZBnIP#ug( z2v970^G;`Aly2bxO{eleDBlCiOaA_Ny&f0iYjV4Jo34UdS6hKr)Czy2e-ACX_nz0c zZ|f(%eGTOUOL|ztk^{Fm?5t7cN|7c&F_tQmQ6)l=;5;L*UXa${DLvW%Cx1s?iR?VX z^S6PYAp@njr$7LA4=U-m(^2aElu&MB=0B&bOad#~M+oy9;C&UFIA#_O)PHc*kA>r+x=&n=oab7z%2tb9hDprnHzlU1(;~8# z3cs z`woiH=eBlR>wl9!1}RVH(88Up;$5#Y{NpiI+3%05cXV{KSH6hcCa#VjvsGFmB|R$3V@X4`&w6K+y#zXLe?k|#=?IqT6!6Co;@bPo9AQ;jm020AN8ckVtN;k#w*~{ zcnJ*cuZWbbPxVhtb!UR>Sf-*sfcjz~?gxv3qi)N~44q2y$mG0`g&b>4QXGJiSVuhC z$bypa7hX~P z0Z^;|x@cg&cOFh65s6HmAd){+0TPGi!f@!IO^`9W(F(J%F4kFbMZbh6mspkPu33$? zi&a+jm?FY~s8N{((w=xU7T?hs^Hgv9{B!y0tN&(O=B<;|z?p z3H_M6XZFkS5aWCLjdy=X2zN9^c@*l!;P9dU3^#5RDPR~l%`BC2QIscx7IX|QO19A91Bkt^+Qen2B?ou z`q}Lb_^D2EyDee85PDZR8qb^Kq7)Q^@phL<{vQGQTiv0_@KA1!%b?Qaw0wrvDbfio4Dn@4uXmCD*I~kB~dKV*Uw=FM8t$Y-o%o^nT;6Hzc zbkk5pqn9gU#b4Jd=$-1loBb`C#CV8FFFTsA7 zNV9xj@4Xt5L56+~W(}hu0f!|lu|*M8nze3^`|;<`KU9b$@=-S4@(S*gPKIJ5F;P;H zny{M;%qK$~77}jv81xhU{QTU~;yAach}0#hRc+pULqreC&V4btXhNn1LjC~f~AeZ0rT_#Qn-f{#VT>T2{IA-73o z;KG^^qH8K7g7FHHZ0e)NhJDKc%A%BX)^f0;#y_lhKz>wWM&uZH7g~0Q0;^XD7}E+V z=G=Pp1G1(ibT#CnUxuaq5;SoSLmIj#XPO+#CTCzejMe#&>Ukp)cl+{%4CU+Eia_rU zCZb1{VH47!=#noDwQ71y| zb1j$7Z(oJt)2wT5%WeQ8S$1mv-A0DFmxgUbm@mXs-4CS4x2Rq00pR^scy@gvQuLhZ z#o3KyoFoKZ(&QcA6_=kuyJKHfrBEZJJTTw~k)z!UoNlE(7N}`8n5}6XcduVkPJ;*g z3C9bscXu~Lv(nQotzC+C$GCo^qTdtJC(pq$0LC4(b`!RnD%1SeYP_q(WV1z&reSOe z1p4|F=2g%FBUn4~aIjiI~mO=Zq%zTAi?fw4kmpmj5lH3=0 zB`JX{$ZlieCFJo(eAj!u-tUPLNPcn3i^$pUl|^b<`<7)*y^Stemndl4!ECfs*M>|>24 z`=34ye8$8Mq8Q&T-Vwuc((Vo_Z0|RpUUC63b#gyXI#^gCj9>Yhwn^H@%Qh$V? zYd=8pNE%|L7?<~8^6y;v;oKvXpp(Bj-mk~q_*QzNr^Ge&5#(GZ!TU(Z6W9nD<|SzD zY(#r0IB)ftD!NR-7XMnEtK~D&%|s50m^4v{OzXhxW>4BqfaB_^j z7ow#`{@wtYrbiEZRK#GX4H`2rB*lFz{{2Shv5fYXw%|;Kp*}}C;URmz<9)!U5+QL# zH)W4Rx*vv-y%TKhF>oec?kRTsLdJ~zdk&;?)}m-xhDo>;2KZyteZTxA*IJX@_jir{ zVmqx&@G2@qJ(-CPo?5cGdH<%~6LjzKpQ!JvkoWd;+6B?5z7ms9Pj3B}cK?VBmP(6& zE7ZuLkfLchE=fPHDahV>%P@PwLnP-PEOVv~)g^+Ip0yb5MLZJq^-82Y-{i;)M!CJpa7g z6Z{Zf-K(;s-iurd@=w}*#hFDjiC0N}PaeA2Xb-d*z-}dp>r|aR11BYv$r|$G0`m+~ zP{S*b&LrzHn!E=m)s4heUpr&GKYO&hFCaEO$3oy|KwZp&mk8D`zInmm-+D8O6rKt+ zg9plU+jLRi1m%p4yr!=TfNvnlkIP#u{UQqWpbULFpeB4KhDoJ3Dc&LL+b%3A@z;7O zkaaV6A-6gOG?R0X*sw$F@&hR*JphW{m!TbIurcZoC2zpBsIHHKq5sTJA0jj%$Ki^r zA(qqMhqrtuyp3DsSYOfQ9`^mf0^4dSiF+ zywruLu|&WrNR}w zI@#KL_%}zqtnKulX6Cq84LtMIg!(X|p+gHvuRsdsz$8paNyAIhEd;)ZH4?{%*0|xw z+nbCmn}y!Np6fgsWa~VoyaS6+4K9NelYu|aR8e6d=K?T^X~-`46iXZ(VDHBjGPJ2LE@bK*yx|? z;MupqD)@%gz`PDe=ygCFpMs;1YwuM;BIlp5%#r94d2b2cSm~flTO;9f=nO_Jz_;fi zy< z9(XF3wS8+crGK@#D{wu5b{^|@$Lq6W4(dPII0^L>n*A$6?s6Co3m_iLkU)CE8|qp< zF3r?-?y#cnaaoqG-JNyo;j6uge4GPU^EOpB=V5<67k2IY^ExETu#scb#%!~B0}Ro0 z6nOSR9XN!dPhw~hIlTdbo%1ofi3rcn0sixaGdn`FNSsLi;d2} z4K|K@8T>cX06v*vFe-lm;ZP3>p|?RNDTd8A-+Q||%Kr-taS0<0^ny(Mdl<>{EoNU9 zZkC?=rET+?Mtr{z4;#E;edxeGqZ1P}&Uqn_D*r|U$^DYpy@cF**o3|W-nVKoULt6g zDHe`Vc%Ci5y|q(gx)(d${#_@V*GnDE(+6JTyywE;7 z)oL>ht2(UPMZPB|YEEfd&=3`W!o%ZZ7(NE6#&4rSwECtohvcni_M^mToO%xr(`N<{ z5kh%(I&!QpqL}o#PH~?iwQ(5?;(RKmeuo)7f)h$}Jo_gg9j<~W`9!5RbQR0WAljfS zAh6g+(&c)sQ|~;j&#fp{Mhih1Mwg{aUC6F8v`w{8_!4E8m-+G=L@OAEs8QtMm0 zFO=fi1E{VdZA5K$2-1(I^|5v(FEk4~1QtN6zkhk5JtIIe1PFaf~Ikx8Wm2F#+kM zxK6Kvw^6LH>a^3Zzl9L>9C2SE1w{l#S3sB=x^bBI80PjCix1g@BiGyJ42-c_xR)Sx ze!qdC_S;iXt;d2i)^4N@BojjqF|qs=ivjr~pOb|cZbjDCW3m7Ok7D+(DmO?$^(KO|MSELt8&N{@o^lV~?Rc zw5s);w`57eTLYRSBc|vT&4Ivs=tT7TC3;(jFYqPQd`nDJnyvSd5v37MVDD{btd}vg zaYQUm&)k6r3As?5Q5{J(MR4Dm*)!qw{_TnMo;*tdNvjG;awoi|M{yfGOiA+3>zV_7 zHX}8&0V%@X<0W4I38WEf>8&C>ZuEudDWe2g}Wiezr?=Uu-apoRB56zhnZ13BkUoG}Z^$@)WJX|jQh_!&$BcR(!g4qSqHz|C%#+p>F* zB2Xj9MF4OP;Czklfb#(4V@iRKJ|E2)BF@fINUXFxj`0yZHLuYh!u$ONV=Llm?QeLp z=U|=Xq8i4H`s?ID44+?%ECcFdB~U9eynmkI3{( zS7hS&`+!|06=sSQ-PU&mZ^!w58y9~LCLbrO#=oACot-egn#feZ*WC!#HV#rhx8$T| z&sekO*A6U9wCUIkF%EmPGq?oe1+BuZP!>t(%#nR0mk=Z|Ag0(3vibF1AGhc1tgQO$ zCS`<@-=CDPC~&5zbS0=64)|uyOyt7>hpaO5-1);YQgdaM+L^*q&*Y}2JPumd4B24B z^YH7!(Nc(9S4E-hF-a*!1lH7mXGRl^)+iz%hBf9t`s?Z^^gED7*Vs9J8&tXL5DjFp zg5h@bJpLu5>UP{1BaS(ETF*yx{kc0ReLbZpt%}?`Mkam$Q%@<#yz-Cvo8$1|aWTHI zl`uN=Sm>`oOjmD4koeQMerbt9+OfvSF;+l|Xe*u;*g*!-lAAm@!0-A~w|0dd*yQw2 zU9zOkKs;PWdrj@ciG^_j9W$xSD4iE3>$%oKtj7cKP!;^FPsCdv7}c*@AME0)?Et$Gy1s%NnR^-o9`kqetRcJduD?tJ~O-6ocK7{KsaRab8fm`yJQ z1mTI44o?xzbI-avcI@C_K&}NZ=}^SkpV9{Xry;49JX~l?cJ{3$=o&Bw$UUY z(+7H6S}!ZjD0~JjZ!cqe2psf#B}RV2B8Hl7bUG9HccPybmt`1A^#M#QpP^{=0I0Fv z8Jw9JA=~P`fEU*TWf8AHtE&+Dix!3{lC!<%Edy>ex!&mo>FwZ+a2|9wY-KccE{-Aw zHIV7)l<5l61Ys@09&|kq6GH>6f)V$|a39uL{6x+K9nrY-_BinqfwpN%J2xv!l!X?K**4g6;UxlL9 znJD_bZZHb2rgl#N9(Fg@(HA?N#j&Vxo`s`2Sg7#f0uF@?-Te3-f78sFzv72UF=)f3 zx1mFmOAq*%Ai58WQ;gir2<CK0^Zt z&NQgwfC(D8=w{<|ac?FFA z7{K}Nutm)u=jMVv`FECjz|JBpy&ki9ASUoc(y$p%Rb0v*ykf04Vp&)ewzC0qo2m_ZE zr>%3%9D6Ce;AS*BTydbiY1i=l()@_ROg6FFyWlFgG`w%yViFc6_es2CYo_^1;7=dH z<;nq!u^kalHw?82C=wk-(U%;&{6$i2-4z#*>p zAh7N~Xf`-r+Ug06UIUcF9C*K4t*=Uy^o^vtpc#!*&-VFFJ?Nw|zy(2*28-V_ykso! z@^l_WK==hZXJQ?jcWrT!)W+j$*08_^j!dO3Sx`JMqviAz;*N)9={t|#)tEHAq>{g+ z(R1GVo9=m*w()mHWvZxU#Y9D~1*Mli!oq zA(UG}0|zN0AkkaQ)+5zQg*Ie;>9Ugjzk`u zb_Tpg+REV$YZWn8JKX+Ja0vc^voxivp&^kvA?IrtZqU(?h(DI$C2hw0d_EF^Bs>X{ zS4A^O6I6m-jIIs?pKMR+q4&5k$@%~}d;!WK2e7{qh@#$Cnv-K2pOe}|JQfh#K>t&j zZ5T9mT5nG@(L7+&zm`<$Hnc*1rO~Pzo^lv@`NgWN-zHn=`M+m)i4yjHZ*VM1M!y-8 z#u{aO2ne>G!qTeKT~d+=+k21sWO@G%vWep|PN+G&gy(S&K1Yp+S_7oSz44g%MoDI7 z8epq`>b?H)dVgGuFR7^Gk=citLITRb%B83M#l4sp zCd|l3oR4|CS_Xes<(!h(U$1ZWt^V01QtCW`u~am#U7MI7rsNIFR(X0h@J1kJQ5Hiz ztqPK3yR}_8Jso4D+MnmhyVYhC{tMg?e}a9u4L9i<9k#$dgJ)fta^8UKMqfPs9%i8J zxbdNJslTHJBI`-oaCO&iC=#@AU0`*~U_rUZe_(AVskY#;&m^vG*7Qs8|wX z@7<`e5Jd$A0cAnyy)A8fn=P}`XYSnof6lcZaL@NbKmop=Y8J9 z?UB)k70Gcku*WFcr@n-s)5mSCaVTC@)HLqvU6xvkW4oS*FUEjsfqs-W)OW7vUlfnj zC$2^IAPE8W8ucbVHX&iT48Hbz5#4=GgWptBwI{Im6ZIXhD+{^DiBUa=WkYZeh$)7ZR9($ zm1Sl|Vo@38nDo!wGPMm~;Sv9EGxl!Uiv{>GAW6c=E}Cv(?3WVF7K_cvAjE-(fjR?G zvu7yQ`Run%f%8ap0Zb^mqopOPE1h4(82bKTl)EM@MQ-2_Jk)Epts>=)et0LGgw15c zejr-Et(V{b1Ln0AA3P6gQKLl=jBSYB+Df`TgJWIq*ZLjlXYX|9HHhwylN57%STnW= zj5)SPvhDJTmtWo$i#S&MhYBbMi};6y=TAZm;7k>n2IROLL_Yz)bb1+m$aVi?*wwMx z^>e?Aq3$EJo*RHxcr~n1k0P*qF60RhSlK$vtw*9Wx-v&o zl)tyu2S0ohdu`B3Rt*@rPzc4R1%em-@5u34-oCzx~negFv5^>9jj ziMd{aV4F3!uq1wOdGjg{`sIg4`!70bE|}amugkAS;8*p{fy=>TdpX(@GYxLD$eGC* zp_B*`JCG>B>;$ug4=w>HvWK>sg)d1`%(L#Co>_7Jg~a!XJsEPwjDC%QzZYu#=P0>dgQ4n0FueEtHRU4TBr$IJdPIoEm($cFl15m*pb^#%kD`+{S2 zHiXHe$hCiKX`}C%oYdSGc_F88|Vo@x~*km|VEM{gPxjzoSON=4e6H_{-(apiAHXcFStoEv^uKCjaxL^C{8DFkk zPc-%tGNz_vPgr`BK^CmADpBe|Z zt)2>N@94IZx$C8c-YmuEf*>k4x5#<3Xc6CsC5z-Es*gjUijO|$m;QZRC?!cF>U|v^ zjT-+9UV$*|n4X1A&|LL^;;qLV{(id|XYvc-iODGySyXi<39 zv@u7xI2t3dQY+03gV6C=dEWQ-SBpBkmrN-_1qssL?P87-=EsGIo&)+MRKeuvbj8eF zUlnAuJ>RXWMZ9le=~~c0=0Fwwo1kcJonbFW0HX@{wWlrK4yjHv&#=1+I#rh0gNhg5 zOe{)o#CgWsRqZ{iJHx#ThmAQE=!M(iJwd%OZ85U@E(CTssa&)hGQJVXs zx!*4$SY%98cZh3_%fXhmBOuWqCEKFqkesAVWJ^csrPiRY4o1WVydTSSLtU&<{6d!2 zK1N!}XNqYog$8VgFAvol%(TqxjE_4){sW9DYzE-|0NSt@i^=D{kp4!x+_`>GZf=zL z#abo7m7Qdf=VIXsYAg~Im_ZQo>#zV7aU6XW@GKQ!*;r}enHfAIv^LrJUAf&Bz{D66 zfoLxqak4$H_*Rr3{}Tl1`ARYu+Wb}B-ZRD*MECinT4*E_0E_B{TcHe)8Ack`O>)eD z1;RHV*jETIQ7?EfiqPG@2+JLiW7>)<&z|0;<<0}p=9G}mRr#^4h3S=7C)vHr8vUYEV>dYre}GYK?_0vJMUn&1f?wk8e6r#)Z5)EumN|NQw7~tS}x7cEbdU zRmT=3S0?7>v7Tv7AU4(}vVTMDJs z{I}ncfZ6B!J#XcuS{RUq|2~<~`wl<*qOF_Hxd?QwW*OWO0}K7WEDqaS|u_S?ZBa3_c%y;-u-A(Y}744By9w<_uyh73#{sLDL4 zy3lfTJB=8<4`gJZY!oMj6@6xQ|FP!03Tn@s!#VpzxO67vom^z2io!aR4=`(3V6~)X z*}rPT`|lppw}k*)HZ-wxR@PEwj=u=RIbc;|?mXD+I503*?g?&z+l^F#QQM?N#Ic`f z6OgAiiTLB2`?}!eN;(wb}=0!t8U_)qxLk?WV2M38*SC; zy(N`R1q%Yy&h7*uhy9#YM9>j!o}7<9#;-SX=1kV?QEHe1J05<`d{f~pcut)-cFW~A z-+XYdpW{oCW3dT^1Zs82s-klWZ-oM0ym^cJwyNUfRLHgq0mu7`jaI%>Wnnkm1!n>G zImDKq@`m0S+yzFni|inc-C1|=^Fe^Xb!$I6>FQgqM)dr82;F4(g6*hFl#Ye&Zs&;1 z4LI&VVEu}{ma)^Hz#{Q9RzR{Sf9>vc*MbB-va+S6R-j?_()7JB|7r!!eA&uazi8h4 zxtl7U)iquwG}pbpD9S_`_rP@o4-A#WF`$$*C>i|zs(y`vhDV~fT24qA-rkbwg{s^HRfH=N-QczJ7itjNq&w(Qvg~5mb&3|EUDtC z8K}T@f^7D-ntkEyUiT=vIRwcQP6i~iAY5uH?~$_m$GRYxG!zUlADYw}f)p_gwvvx& ztx*fL#W0x<)!ZWD8bqw(_-sd*AHVdHXZA^NVXV~4z`OqiAogZdA}EKC@q7d``hw!H z9t6#g0}pfK;DHViWQqd#=Z~?G@hU4X&*(E@f(4%;ljg*cA4noW z(+vD?*3^O3hnz}&D@soG&nR_t^hy67Z2sK`?gU+0dz}gW}IC(X_AXebbRjd^_&liq!2}QN!&Dn13I_ zSHCjNVGY38i6=|1P!-hk{ke>sBesGh4A?>S7Q>h_V zo*je)9BWF+k^OLo4C4Abh;hqAMw{0Oj&1yH>QD>t&bp9wS^wsn+q#e^N1pxb{Hw-l zMP%7P+}?Z;(9jOmG=gAj8~9VL?cBV)35v!Gcwhe!inM((F4wt#IM7OP7h16bWzq%* zqv`l<$4&Fy1R|5VXonZDjE-fIw$IXO+eXs}^)O9KDtHNkQdH{HZDvcyw-p`4_e#1z zv^CTey9&PFsqnY)$W(Hny253#=76?I;3~lc)*sndcMG(c3A$ep)f>SW!`}!B!ZFZ- zd7RTT!=Cvn^7Q{n{J@D}A<&QoHNG_|Iz1j_DPGj0DzR8nRc`3eok;nuk`;9Zga9C; z)Hjmk+jbVneWoT(KE_^E4-GRUejFq}fxPKj5SBWEJx4!7yjBEf+<0|C3; z5V$giXJW8^|2uSgk53WwyfJM+s2CZn>Bv;uh*G%Ux+A9I;;6^*EZQP5(_4nL>BNP| zf@rg4T#f5w%d&Qpr1@4h0tVPKqsP7wQiTKGeg)>OL)t#!XIQNWkL#K;f}+_zewBIX zB;K{Z;_5%X?orIIvJL9%eV(d@>qd;w_Ou5|4Ne%XhQr?s?eTpA1ya!uA}qg**4bwj zPO0KpZV0P0nPAJgI+GEbz+cgfJoH&Gr;G3ielX{GQzwhwXUJTMOz-ACAt7q!rYzcZb3Mq0K=2gg{hV3GV-=&i`+J`@ux~Z!bW!$%3)dMgrE-x1Y0g z!{){|Hor$!T^UVRfArBuwT_`fIcrms4xw{s6GNl98-LS`hIMOAqz zmpkkmXs~833imdrxVSwb$(WBI)%`#e^q_hAZ>l2r>ZGN|?}sd_^Ra+nMjPNCpcdH~*1-zq-7IZC2%PUW zGG63=2=6^%BR%M{8!-o`T02>OjG`)oI3e{d9Op}nD~FsA_;t%LQO2>RWkeJzDIi}3 z7+VxMrXS}y{ma2f;vjApJ|%x#wrCYAo0>l959k-^cohVul9D@_R@K))q&^Z4>r6Vc zM;#s0pV2vH6tqf*!SGudO5Og!^Z#g#yErm3)(t!ST)Piql082=rbS0U;2B8stp*H@ zXshH9^4gP};P@`_4?#cZeTFP&O{!Fc_6wq-8u)8FcNHf$o{Nc)Y$+SM6)gl%uEv1Ju!;3d0LXCQz~7%dd@67bRzf~3Vzw)X^m z0L`Z-?tEykGE^>z@%zw}j{1BQP%b~@kUsK^U*BIB-CLlDeU6@sBZ(V^3|85Vt#bob2qcEv%b&HhG zP_d z6_uOKt6+%3<%v{klimal+a)M5vt_8m(Lv)n-(7R#WN4TpfHhukr6U^?*w}4eRBSe= z_mEllroqrB;W3^L((oci%MmuK~BnQy{kZ0tI-N@`k?N$IEf1x8vErUo3pd17F$RZnvwbl4jxZ z6xqx}VM$JBlz?3q8q=~Jb=fFql9&{0TS8}91o}2W$&l2*6agj`gKzIfDaZBia=@_a zFko(bYQDuZi=eioK?CzZAk>B{w>6NLrV4o3UZDBH^$fz<>a^Sb37+YDJNe$-T3TIYRQLFfIk*n?$RHZ2gQ{(|yl=fQt@p~3NK9A#b#4gZY{f6}T17cr?i z;FpE*0BxScGb}7^iNqG@hGJC_QaFJ5=X{P{1GZTEXOXU~w(nJpEBcgr>KE z))Bztli<^BKw`oYl8TvlE*slJW1w~Z4S}!KFtzpp%X}9^{O5Ibd*{#WmLA=G@@+u< zIE$4X)gftCMU5^ytvDwx5D7uI!kFIz-O?A5;N4KWbVK(*B)LWfs$XzX=HKwAebgBV zeU)Od-J|jJVo`RjAC(U>dTfb%k;Ui2JMI`5m8eNbdPOm8%f_~C>najLlpMFaJ(6W` z=2E1C_CkfyFT;`OJ?;&w>Ia^BY7a$bvJglLC{m!F1cnpWCHpwDJ3FiQbWb`W3r*>%XXG2zds@1GPx=HL^#HKjoq^I> zEU>}5I@1nSIw9P)1+;B2NYT8{tX*0C(P4MtuYDZ4x9{sF-=p9#0WgR86!^<&SW{Xi z_egned82m#vi-6q7bLCdemwaMdV|7{YChnknFqo`td&61$oOSsWYFE`+|lR#w|_JL z?FmO8PhOJpjEwM?uRhz{s!F@Uq39}@>)S;`P!y4xc%Z>sh(o&WW9srI6&#wVF8~G0 zgj}U7VMeZ=M8l_xtq9uA7;wi1Dz{ZcB;RLGu3lC#A~UHb(dkk!fZ=)uGSfJlL%a@f zsiD9HBQR?|45#`g_)%ujy!d>nCp>Ef%1M)J-U!Xml4jZ9S7HZH;>L;pjUjA_U-z5ytEZX1%FTrY$= zmk_};x-fm~V5_w``{aV8ov8h`5rI98VTu`*ZUXNhJ2^O`5* zU4)7H28fdzONJj}k|W0?Ho~*L_J7ZVD2FlECKy;(ySB_3z&$^b_|#5%%%1;LMXGjhf8!OnE3R4aVd5Tgvb$ zd6B3xGnQL&)!O>dnC{trs82Eg^KC1FsWo^nc_*PU!j@w=Ejq&i;=m7{m7k9_|HRwi z?M7&VsihRSvH$`=oaemNO@Su>ADaj3aCrAQl<1wZe|s}Hx#y1UkyM?)1eZ*i;t=}` zo18f2c0*QDMBnl`Y@3_+5@pYZw&hZMdm z67hUq-i^HGSl8|T-MTj4Oz_)20b2{~T+}OiSbfCmWCduzPYOIU5uCW~`2UafzNVE4 zP3BV+-i*bPQTVdOGrNpXO@7~|il$&G%H*7bz}NW^MZP|~F=Ho5v>+&nY*$WSn6gj7 zgdYxz{|~C1@^N|5_q@EMUE4gKTtl;*1qr-?s^7bdXcvUSPBM*4;2zl0)X@H}vt?(L z2n2FGSvbsm z0Wx9^0&h^{H??z-oKdYBEUGq#-`iSPSU;zmwoND+u~tmB2&fLMnJCLnH=Ati>(RJQ z_vb;{bM&^YHJpLWAhv(TAvU(e@1#<*(`LC3ur9zp>E+Ot`(PL^;uuyBsM?FPui>wR zb?v+M$Y5PnK7h%J-|1?&0iK~XaiPuyQRLco8pjxa#`iD-^=p=b_A$|J!fO#M9QZpR zWyXMScVVy~ZDnGC1gCJXB!L+s5&BBmjB>Q}Pmuj|xtNereIs5bcG>=&FOM(mlMWwW zQHGt9y%GQJW2H!MZ1(h47^Xxvcw`95?i5C}*83aZNz9i-pHGzi){fwGq+AP_VCfB= zjigEp@wL-%+c=n1u2fT)atK(b!13#)%1z%KR%qxQ-thf!Gj$@qf~q9ao@iw%Tr-qb zgGwQ_!H)Ae-qsM^v3m848HY*_ohai$+F8-)KN|t@2arF$C!%VSgJ=CvdPp)!Q&^Fz zrWa+`{ZxO5;Xn$za5t(i;W&n@6M2s(=5q-d_XfD zC@Bd}wOV5@JUZWh-g)QAbB}6DR+1&QuAvHAjBB%%$I$3hFw9f?wl*}-9WiUaZSD@e zU%Km<{!((OwT*$E7LI?2W~d=>Zf@2k>4E0rw5n4b7Vp(}+}j5l=okR2YYbU^$LdNh zYYWL~pM1Bn^YW1+BLg$6fsdYlUYXmiQG}#Mw6OPESmt7^5v2TlOizjI>78Z^mt|z= zcYd|lb5eeBGO}GJ!lkm07K57#kl>K$7SV1^d+JaqaRI5dP--?`rUc6<1{byU<*2i;myZpg>HH|kJ%SEU-OI#K+ ztbR%PrrK6H9Q;zv`*w$@q>Ma6H*Gd6w;$|zg}d#R`l7=NPJ39bmno^TS6a>t@JFD1 z)CGVD%>X6hz&dYeJ4qZM{YY#L$ZcZdlpm`bz8s^$Nt*)1Ysgt ztm6W?gY!dpVvdF_&Gvd;O6zxMA?&FNa%;<{*5>m-PVvtdE>>-A)l-qoM1<@WMMdKB<;zWzFa*0p>!Gu!zJrFtHe1(T6tDo`5ZNB7%Jgtn;;` zUK@Tf8AYA~0pgQm=IbHVkWo807f_XQmN8PTTq&`3;=z&O;3Pox@;<*pivO^W!fNc_G&|2WE*P_e4lD=1gvAh`VPJefqJz z<`4?u$2}Wv9w!*Gc9!QjJMqkXcqKK|%c1~gPd7C7ZmP7S2uK7i7||Btf!vHL&Y!_m z0Cr9W<()u3%7ExzQ|@rI)_?c%VZ=gwK=4nz7Mx+e3?J;BNIU)jmcuPY>E4lO6GN;C zJ*;hLkI9Q7n&Hq`wy(3^Ls-7?A4Ls-kK4*vQh+JH7w|e6K~s1{Xk_{6VXKY5w62ai z0uxT$5QMlt3C?psi98mI*xs>V!3if|NZ(!d{46LjCZe#NQ6*-bL%zgDEG^w&t5ABY z8L^HD2zYdETezt+gsYe27!c^9K-(t!!NdnEum9%jZz>Bp(k{&%H}!mnjX9rZ z%o&J#^k6t@JZdJEB0STA%GrAWQ;owwkHmw!RsaUC1IdXc6XzY> zNkL4SEeH${NEAvH8L!I}TR{X@;y7ePy{BmUZJ??AntbmG#umZvBLa{5XGdm_d0Xo{ z`*rtsk@I3U6poas`*c(Ov!*hCl5}GiG_&d0zc7C6)F)$<<2i`zv+(!Am?C|f6TdQVE2}jFSY7pL!<(T@N6W zXShvdPG{Jp-x2o;e*ei$6x0TcLj^L(D(nm&+qtvN7K#S$M~d)CSbCO1%ambt3B zjjwERTS>x;TMvV1$Gi)x!DXO1ybL7Y*T-coR5(X(u(mh7Q&PWcsHJ0w=OO?3Da6Z%;(`Wvs7SMBiUseva%annMkn%k&)Og z8|wXd?iGfvcf$MrDkvjIn6~yGEHZ#YLMb;v8c*k_idx_+Dfz*i`^iE1wfq%_% z!Ka(V3aDf>Y8^xC?}t?FO9mOaVMbZYxNBSg(|iBFjyo)Tp_n_u|uJ0IE_pQJJ?uRtm4e`fUW9~3zz1TB3U9{3l$ znn|+vOaMZLLs0eOU9nW06MqhEAjHOG0Ls8@Pz?44coRl2I`_2dso&rbvMnOd!fZEY z0to-mDtBmnLSUYimDL`Q!aLwQuYwSPVA8@QNJYkt2;g%D_3U~XYieo?_}XP;vb~Qq z;tdFR+Q7qeb4g0x0O&Sd^I-*QdTnY8ow1^!WA>)D$m9z6%ZDH<4&b=C2$J3Nd3&8F zoN2ktF3^{t%O8g$+MnTjU#bIcpqR|X#Tk}M*Sf>!6&SYSW%;g}B`-d)VQijj-DJ=j zmKSBTqLPP;XyBxcEX!sf(d0sq^<06HMArdp`g$7We6LkipV252zcE5SIq>lI-h1z< zc3oSD#1RHGh?9~#A_MSKyzRjBg3!yTrPSy?pnSh!ICdPg!LyMf3(EzJp+{}Ak%|ra z!S6s)>WA~j3yr<&*&cQ1uli4mjYri6PU2}9R2z2UE{gZn;AtlouR#o`QaMquid(lH zkjuvY6r5aLg*kuKgYYAbiwoLg{D!W1!K(s@ zJ#~=c=uMG`u~4I;OF~*`S&)|3P%Q_lYb%!TB*g%RKwBP%Y|ww(!(H3@g&0&4DmyIcg-m3c=O}GL>t3*iz$E zfy8u20&JRKVK5lfwypcuw~-_XT+0NNTM@w`?ndUAtZKJIn<;~aMaY((PReoC;Fu#` z79w}#oBXGHZ^2}LJhUv)7pv_1!m zkjj9w*3iL$K|czFffw0+b2IJP!z&IaF`e5l--}`n-%_TyIJ#lOk7992KUrCQUyDXx zL>lG&@R>J*^{l5tvA2&n?0#6^7CO^Gv9H0m`;R1x@G$b6p5?{VXTNcKhPeSb8lRVb zV5%#l0D}8ZK$*nAJ@E=i<9CA|@^K(F+JTXT_k{T~JQ4Tn0#`h-qJkmMCGiq0N2LJ3 zluuJfO?8oHVCeK7jK}K`+yWM=r9eu&2Z0++v9TGLpr4_3(7Tmm#&lU5W1KNpr<@et-O07BjX3{mHaDl9A=cuEU~NhGdo-kek0~Yt61Be7*!x@!hqz{tj-6 z5(d__!RVz}(2hU}koKJj8*MWO(HfP4(rW_(NNyw>;W1`daWvAu4}x^R&M>8hRjbP5 z?+eLn+W?+g1(-!$HI|tin*u@9(A-|{C+`k9-<661M%3E0!ub9TZb4JoPqDEjfG~d1 zRv+55@~x-pPtMNnAlb4+V+4%VJtnqZA{stUd{5FAFpLHLz{19fJ(ApBfY)#d0A~1E&H0g%`?vQjP>apm<&j z*_rT++<4a2F;71%B zr^aa4qtsXgLvfI3sk&%ts-(XI+MTsEgL=lb^q{PDqS)tmDlhj$p$MyNYI!?BQsWJI z_e1j{Z%*@?7SFS|&KQZYj0Tl8Y^T9j&R)lB%#c468W(pr;m75sd@7YbE^!MR5 z$CE|q;@R|94c-B*kv8{beftvFTl{58bao^(Px2Ys>>7)Z@&eeb<{>bB{0JZ1dYp289(C>5L)}EU3c3!AV1*mVd^!nzm>{%n8BdD zBRz@tf~!FWA}qq0)T;_DZJIQx9B(j8iKZq?CX+Np)D+Yw<%@z|dG_m-O$)99sXfN} zRg-6P;bxeQ33Rs>lfGu4s6i_aHLd!vX{!CSA= zfniNkAUKy(d-k}?PMxtC#h}gysl-FM9O}{0OuOHVE}b=IOqY9#^nb?Hx23>MlZ6!V zLKN)`hyt@KqaEB1Fu6{&O_rEuRxn!O0xDznAnIK}QDKE0h&82uiru!A*Q5{8yVGH3W2&2l#fwdzsP1y195op zBvNFvWzEVen@W8OS}y^GKQDlZy;GC*1yi#esQWDfmnzi3t)1soTH@ad|lAd2cLSA`rah zXH~8Jc-4BIswpXkVC|1gweMKYNbZrAjHyA>WPAjXCz`VdQRRm%cKg-39BrmO(YBJ) z&c7mTINw42rGFz5@W#UGj_D-h&mCwvfU&m2XIB9YxVA)+Orog-!t(1Fo7Y6m8$~&) zHv~i5Wi!Q_cKaijbayue3>n4+VN*j6Aj71DWi8iP-eq+shUtXZce0V)_0@sxAr=GFs&#?&}BU!FzNtWXqTRx93fRmTGlMBG7L@1&&la}AIMme zc+9MB8KWn}U>u{7^lZ4eob0u-X5JZ*%_mnPCUuO%;$Q6#1d6Nuk;}GwLXYk8gy&WJ zqi5Fu-uYw4|J?6?vF6(u_U4N=%Mei4@sh5jSHgt{#X)agzpSoc!nFCwp#3AvzDe+@ zO>_z3IJ5sSkgDhiGSOR%kkUcrPzHJU@c&ik4w~c+vYpDTc=dUTB5FUh%axj9tGC#N z-$B4%15=ZQ4gQmh#<#7l85S@WOn(3XKmbWZK~&au8+@Amk#4&~Q|RXjn;2D89v8S| zu+}wo<_Ur@azlHt&z6o*5`GB7`L|2fnD62V2!|H{lBx`iYF$QB{yd~T{}aY3@T1Hl zzBbR!35NqliNOaCXja%X^K~s4p4Gpo6+xtCK#RB)E8xf9cn!SI+eaqkz?~Sa87_T!ov_@N( zUf8?0hrGmk$;ZjOkr7mFD%m;f0}D!qAf%T03cunV41h; zD3$@X_gduahcL##dgjF5jr&znsHw&tKd&D4`{0X#+dvR$m&C|mc-3T5GHN#DcMz_ zx^|f0UA|f3^9|~jQ*qq2;Nbl*?3Lf{&f(Dg{L)jV-w9X4ZSYxw5>dOczAmyb!GTM- zD5TVav*7Q%4AK7H@b@|4bQG~y;AcfJg5HKA5HDNXlh-8Dddamnw+BjOokj%<^HWxm zpBxQFFpS(0gNHg%15umo)u?9fLrP<{lV^IvxBan$3N0mCW}=P9+P{MmOC=deX{b(- zZ&jGep+(7o#PvyXhz(4D;Iq9FD2h`8fLZY>{TGYH+yTOnd!ZGNMTB2gO})jg(Q^Zg zajHnuS0hyYw8i8;I9A=R?rp&0BIG6IT!n0}zd;2@Hnn-z_U)b*ZtPY#bbU);3b=gV zMOI=K+##b30wNS-$|;Rc1) zhME#}$+`XF>}K7&6aT!^6M39s^gK>yZw1ND7x;1^&=!pVp!9X7+2<7jV-6b9$!Qmy%=mdqRES zM*9$!R~i1~Kzk6uXFK@~Bux@vllv?n*TV5%Cgu$J?dNX4Soo3~*L6g)bqhNkl#t+i zQEIptx2H7Q;lWSwhqyf$?1j3zy#!GR`W4AftA=mc>(8|zaB_s%POb$%q$R>8o$ZUN z2!b2iJqN>8H=PETF*cG6k(a~{v@n7{nBzEDPB30aZR^~@>CkdWdGb=MaL-t5^rM5F z&Nzi35i$j+#l{Q#Rmddmjdza}{9FtTYo(@vMU6wr9hx~0L8z!I%MWGrNLxYzaO4&w zD=)w?XKPGkWqEdX1HS6gA{JKr2E;InB|XrPE2K?Ay!ccJWWn(3u5l>his}7bJ`BYF zb3zkga1iEwFB)}^v32hnS(I|doC1sxH%B&&x~QVeg(YzvwC#%(Lwglk`5uG=r>Q1W z5LL9n=*Qc_P=4#+STn$;rvtu>fb)nOI=O8_&0rVCIS1?;mS7fw`VDaQMYQd>{|V zs1j%fNFwSIXtmG-&AqTo9~qS4_!p|1&&P6nH!Q$bSe7pYG<7!+PyKM+ix6BMNaif8 z>D|zvuN;_eBjK%IwEd*{{-0i%6Lke)(PR+CB*hd~4Mf#=AdEcZ4Q>A4n+p39z}*i= zH2Fc1=1OHP)OjqyOYXPo?Y9*@s;}lnt~!kq2d0#|E`M`dZQS2Nd{515zus8=-I4?4 zhXpUW2XUm6`c#CO3#RWKkYU9jk6EXg+8cu$4i6DzM6mTp&z}V|?0O(GfbC-f@H@}f zS?aIeQ2V=?Ij&CvLFrl4Aip1+V9BCYxX;%a9Yiz)(ymY5d@2yKs2{I-`Q;-7FNv6g zjO20~C%l*=WZoFyj6HNL`m)n%eal7#mQFAGp`atzBO7TuVeDE0t_1R#w37&XvOjdh z_x}710p;)zZ1CI1t(tl~m0 ztVui)4aTuH%NQTalrP@Zko^6X4}C)5(5uSkKcE%VK)Wr49e!H^{XmW&>A6Tzu7{t{ z06{%K2|*eNhrp;z`_A^Y%U4e>&fJ+0yreInc=lD}FLio4Ce_xF_>5iQ`XJ0AVnAb2Bm+7eeroplf_182iHU)20v- zo>fIf3gClvqYE8-Nd@0?ue>Gct480+OY6Nya6cr@JyG`r;~O&NPg=C_C!aj~#0I#o z<{-}TINmaXiYkM4`yhO~_dpXq6H_w;dfU5HMt%8UTjLTcqQ8Q&IM*ZARDokbo(Qd& zG4AdjJNUWda$GduIHZNPOhSaa#iPd#{^RSfBLsFuv{0Dc*8^C(p9LgIr_J$510$%2 zs~6`u56tPNJ$CN^cpCq7f@A>nOU+PP&CfU{}tQ;2;$NG@D7j0 zdKT1a>Q8Bzj>QShm82x|BJ(!9#iKBYQLw7bN66@1VE5d(H@-TwEry1d!Py_d%X>K~ z@EMVeIf<$piDQo5FRu4KfQNDlq_nqLQld_dk&-RK7hW^;1qeyvKDh4ZkO$WzHD{u# z8B^g8?*pjjDv`@eTZX>whhV+eLbK`c;XQ%= z`;j$pe;XF4gb>@(8lD8ZX*e``287$SoT-Xf4BKFa`+1G>t0I%bH0)nTmhyf%y{-qZ z!XvOAKxJV**%4%)JEyO+b4{xkrWp4s1pX)(I16gpYpzOYqTTyO<^qx&VO_9isETy^ zi0rh@-?n=D+G&0q6b)J7v~S>+iYI&!SB6DoCJ}TZ%)y3erRS~k^6%XDpT|G zMOmrw`xO#n=zi>P>GL;@?L9?7EN65YF*a%}W171SRsU{9LF!)ezE#wDN3&Me?nGTO z_qO((2+qaF;w@;wMSSw_fN&XrG5e-7V%k)>Y00sk@o!9ZFMAq-d=r&tnBo!4KUA z=nP#OlyebtE{SM*vZ%!t9~_w9S>8=RcJHuaN&uSD`FMZNMl!@;m=Q=nW}c4)!XFGx zb#&ofo1^j#;7m9Nm$xA~o+T3iTpzg};rQ*D*hWK7!WP?vKJk@>v9CU$8K z-H%OtKIjXBFpM3>(CTw6#pQs%?i{SDxuVH6ZfmYaT7anUSbcQq=~Ey{a>#?s}>F&6NK=Y1T$(PvNnE) z^BF}~9%S-UcAZ{U)^*R;Xv77yT_^67Dsq$;ydwB{%tvZH=L5Ib3 z=Q9C@uD#r8X+u}d_J}5-Iux%dT5o4zQd(<^H=LX5kcK|}w9#YOh-7dLmVw8>2c;?7 zVRP9Uy^*rbKDo6l#rm6CunLoH;gemaD-$RlkXVDkRPTVb|Zod|IqtKsY2(V>b)4Fn&8jpwx0oo>@jR_w&FWEDz$Ci{1u zc_tL4Bky3fz6*kVIR-KYmWQa$#kzuZ>nfX4S&p3w!E1+5s0DTFTWUkfj}nCdtRBa2 zA?qj4r7I~5pqi0;k$aOxg?#S5c|*ol1)zjSSmLSRNel)HH&a0lt?0T-njBYJI$`_s*4IJrtG*Gjs+SYh;) zkl_b)ja2F~n_G73@t3Q-caDcMwZ8*5TMwj4Cgk}<5DJ}w5kN%%^CJyOE8f7S# z33t-BiUaO+kjT$N<{S`r)E5wttzLhi4T05jD3m{zrRcwr+wwl1K`ylJQ{g;22MbRo zNc4LF6MadPHrvA}VNUwIw=*)OCJ==uX$wyvXc(tw02zGP#xq|4KKKz36F0=v&JU5Y z)+tlk8h}aaB+a~UP{F`6E1;f}_KsvHDr4t9Sp_*4Fex zNBwsGt!Vb!RJMw zq!i*9lR<#{bW>1<(fs{J-nXc3RH}#64HNYVkFd19Kk`5SbW8#GpP&BYM}oOcL1!$y z$no+ z?ofKK@)`5Cw1=-J5nXZ~85EM0(h+F?hEnA_@$Nnal*1`Wj?B`8zm`f)EyUa_L3{|x zF}*Arl=hdGA5-g&HwCj4S}27wZ@@i393~ctUxKro{R5kk6h-}xU!RgKeOW=!& zQu1TENw?vlTo7W78I6smC2?<94~9(;MhDtLmjYpujqmA;OG|@oYnE;RH0D*fMJrH# zsjjG~C?15QVX`OA#dk5nOFA4p8br9#`*!Z%)l{?3B2&xS1#@F8EUg6Lde`%C2ivwe zIPN(RP|FZn74Uaqfl#mX$>uzZdtb$|$kmgQU3oCshFS$KhheDG!3p5BTS3oZG8&xO z92H~RBtiGXy^@N=2|EP&82FICG*t6-yw+K$GIGYyS+n9L$6yNLp)-R|NlJ?M;Z$I= zb=k9oR@CPZXneZe41PgiaQika3$lv#dVAD-64%`c%D~%$`#qV7eiLjbu*;Xh`-!Ay z;|1{jwo8io2o@5g(m5t?*>YsT(!_Zu>K+SmFA$>l26HRu>|KEFunFN8LJzWpFB@t-)CA(0z%1e7Vo)imjshSz z2mwl*wTfxpe*nt*TyKYYupAmG(H=Kkd)t|)PVv|}ci^5a;AvP`-Ilqs!COXL1CuZ= z1mZCy4b(iP3xn8Kh>vLEi14HBZF9v?XQAsK&MpruGyx# zIx@HMJ!}_6&+M>Ry5=W&zQlSu4MDpru$Yi43(k>Ku2xxLP|pmcz7Vs9XNPchYZ~zt zlYWp5N_UoK>aTg-u{VJE4uile1g)+E8v3xb;lCYij$qpb6Z9`MMJhvQX;HN*G5-&Z z1O^D(=lfgwytu0&g*?XN(x4&&2gkg=zVno z>4LK+^>`F+!b`ArwP7C3&vSks#QeGAa9jdzKX!9siaJwV7lYJfIs};&TF@p?FTUN} zBPC7&+5J2MBQpf%GO!3~NeovTrGuN!0XYtY75*b-V!-V{+utF6RUJ9Jc&UDmxl{}r zQ?+o^_1lx}yAq}_5yo+9LW~qScWb+EkjV&(V6JBHB0p2D+VkzPgb10Oppm=^QTF+O zlw=~i>%E8(x`kAbAlD&fd>oA9Q?}OD zBQ*trA%tUi5gLTrpY-ej>9%dSlkv ze%L3=EmpxYT;*bm5fq5~@kracZ=@}&+<_VJf7}CZ*AkjCRs#v)M4NK~xoVOa_3tee zDS&8o-Jh70L|`4UAXcC(QKW+ooIWtg*ZulG^_h%)PIC6Mny&3tt<2lYo_x}O##OhL zm=>moE-3=X2@Q+(Z$3Dq4A39ciNhkd59-(;*;M9_%}xWN&28~pTz?Yai8kAspDR5a z9Q(YsrB6^7?BceSJ4hgr;G)x#gm-`t$&QTW=O*zp<@Fzc}Y4ScT zBl%siGyD`xpByX>WsJ!^WxA_hKVHPxiTnNku_w=aV@LQRxYQ&?l4^NY487HMus%W8 znP?MP#F?R!{tma3Q{>dgX7$Xk#&0IEBAp;WGE`--%Cnj^YOFIXQpbqgT#0DPiSvI8 z`^sQ2Ra4nBz&|no9qWV<^j)atzy=}@$T)6p^Ox9p9(1PE)iNUZcqu$cwg`cZ&;}Gx zB~4SW7;5ATFMN_z1WeU++rwDoegJv>PsXZCL-95(9XsK-Rd-J$ z6mG;v*hpLKqP_-Ik->dnx-f@|z>T{Y?Fs@=KSeZ!;*ydr49aBZZD?P12f!9AnWc?|iJ+{DC{a|3*#+^9b2m&%gCMD|G)dx^+o?Me`sH1y^m7;Es z_30CL#ndc(NkUL)E6A}47xUT_o_i42yMwRZO)}WN-*kN`!}6CnJb}URKCHx83`FO? z1IXyhxum@KZ(t*|m@!HApm=Crj1gvasGXss1uy9)S+rbMZX0r{&tz%w>BUu^i39^n zBKz$j_W_5)`Yo+!KHW~UJa6l}x-m3i$&w}U`TZLhCaOLh?#CG1%Mhk>AuWFo@p+48 zGB0t3y&w4wNmQhd!!whr4N86(@9N`t`((IIGZBbG9cS}a%$plSQU4<1s$g|~I4#iE zaHRu(c0%O;MEDZzXG?3~7L#?p<`8^?0@BS<(9QFR972yYuKy&kF3aZKno6qv*V zxEh*T3SQtSw0XD?!T5QYK`L>bAKL@CWrawiq186qQpF#`nVLxLZ0%>Wxw~nl@t3A) z^@>WXi_V0=8G#s*2UNCA6wQxMw|OTmK~d48?@LJ9aX&E4AqR~zH_5@^Cur<*_?+uDlPHu?svZ3`2BYFscM zeZTI1kIYW39GY%(V8 zC=?prb-svd%g8_+k>tv|>~j$G&%9}l69K_uxUvL?z^zA_r}t-ewXO zU4^n(5ruvn0{0Y5ux*%F>%g>#5KEl(?)OP7cOP_?xGS%JN=k#O7*8SIF&FYBg!vP3 z1U;V(NOSBZL|SCQQdKh-;}`Av;AFLHR8>C+KG8M+K6k-i8cH;lu*{cCnD&qDo#8j^R&gBs z#S3XFww&R)i$Dl|5uj}EGnKv{K*kd1lReP{B|5wi_1(anZB7cs%zM_r|4A^tgcxW; zOXpeOulWZ|((<@gtDB!_g8K5l|VV*bed=_ zu*5+|q;3;q^jezchVY!O15Z1|<@Sx-Ssl)tcgS@RzculZ1Cv_<-!X=X-l>;n`%nga zc}!DoO6AmDG%x%ClW;2fvIN9MPefz#OYlMc3qbSHLDe|-q>C@+NukWb@)`G7Y3n;I z&%MA?=4A~d@MXVAFpov?>Q_ywuH57Z^ zIW*hR@onwC3RiM6s&6oZ4356NZ)U+`JA9$LNwQ1goD*$N#%~me>p_^`6yl<*%i$A0 zRv(lhlV*ff?NZQv3cwtGfmGQK1)jY!$&q*8zmS1QtQ2yc4b9CFtHkVvwJI=y;7P0C ze!}&--q~Ya``7-RVWBUD7CRBa--k6-yBiq(+rSn5cXUd}%gCT8Z3PsLE(H#?3tLsi zd<_AZJ24SogH_r!rlU)TL3yJ`!fDLJq6|?oe%5xx1pirAIO?SMDrp)gn=11$f-1K{ z@H3o(B4V-VWAL{UtHT3=`|ULXn@;adfBBQrf@F=vcvYlCHe zXbb1|Nd~b_37Ex+FQ>K~eIYN_C}^b$ZOMXrXC|JH9YUx8(7u_R%{CyS>K+8Az@AAD z&$O4aypx>)0e&4cMo?B5&*Jr4%`n`x3}u^vgbdEsf5=QTzxT6io|*da+Q#qzQgVBB zi+?Ct*huPXqAmZ;Ugzji)-(hg3dB)pbYdgi93n5hi+ad^1KbQ;F=mF$m`hldy3-qO zZX(Lrbyx@z$9Lb8@y2>A(80Uh(4`Tq!3z^FM5~FkVh{cF42s8{d1j3lH4=nE&MSai4JU zvMe-Rhy|r4DciLj{@M3|of`wvmWcrTv@opFrRk8gT4dw&2SkaNQHn^9N_%E^<6PA& z)Nlv_E6Sq$3tDTKkUmouYmuZA8Sc6*z*jO)`Ut|f2qdR;p@!{_evM()@hj9pUI z9w6n5j=&~PD9ozWc=mBs(dI)9uZI~s06xbu*dCzXGd@st=8ue~{jF`?3Lt9^`DD+! z;g-p$4sj)jzTq}7o?^lt1j=YT+z*UE>t0t@R$Ta!no#f`eGS(}2`DV@&9S6Dwy7~V zGBII$rO_b-^dE<_VlOn#+f%cwf2-^aowd&&Eu_Ja}(M1tNnt)QI*Mt^GFOy6%edhJ||88Jnz@YAm zyX*h=c5x;%Z{EB2zI)F-=R4Vw#XxA&)5cWY(K47)F z&!9>GI-!Crjqfm?U$TM7cc?hKOGFAT$WspFG-k9o%+lQU0wgA60vl;i;#v**(}JJs zCesU!1~i~^N4Ns(!}p!xpu84z+bMT$p{~; zLqgKSTep0-<4l*U2}K4!heFbTs@*r+y#6i;xaq*MW#NEi>_W&@DXp<3a7K(AoYCVq z!A}3BZXWlx4bi9@kYPTA9cr1FQJiQ6ck@iFv(sViy~@Unw+jGG!rN;>C6$L6-Zrxe z$_}|8AqgW88F^0>O9E4&bXl&X8R;yiM~SsSzWaBMmVoqs=f`dR21y8Je&Jb8XcklI zsv3(NI`OxL19?=X>H^qt})Bp_6m@xxBHFGc)wbMY&IB2G)>%cPl z{0jlHW3~Rd)QeiMA#mC^IofU}s zDk$EyKE*1G;wbjIaFTBms)E-LPU7YUrrD`A6~P~37BfjQoP{g3EERwc6)5K-ihla5%v?haj3ou3oB2mV}DLBzC z>QQLGk0#7uk|;v4u0h}^&V|P6tCyqOP`bMuO~PY`LkM^pLh|-{ladaNXaz@*?-EBd zbs}m0Yw+*}jZC_8v8(9VNbdGYQi+Wg z8nAox1Rg#9z)FZchkp@Z}vNMvT3mf zO@JZN_pp;K z9T*JE<4cf@<%`ntSGuHp4zdIrOso;s5cMbR8{7voLFr zGW!-1FAfr+1styd+AFH@&^_FyVBdoDWCBf;K+`8}C3KPA@0Yd&(t9KyH zB+)~>=WI@xO407j?>T)JG_3GtAG|GLCTI z{@OkMjNfzpM_<+?Yg16TGzoK4m35|UTWxJK-v|vztwD2~VdL0NNKyg)ikVhlQgW0` zAecOf;2}vl#LNF@83VFTw$%m)puMz9j}Vx!3~S2*{*#Ac_1+GAadlkPW{_&eq)%il zPz~Z*_(u?9Pi>g@>Z>iXfP7C5vLOMwAZBthWI!2JUfvvndidLa{l7;I^uPY|wtsQ3 zQCdkwrFT#3*3M5FjIbjFxXX_q7_12Kbee|^R)HjCnW->Vo#jWwqViUMmmIQ-px=n; z^+gKhwA|SoW$6tw{Y7X~mB2U81Lwe7zm*W^oRV<8 z4^Y9oh~)%RSyl5yYpbP18zo2LJ7RKestt_XjQa~#_cWvsUIOnpp)z{OTVGa$^K_JX zbwY#3hG0e%O^U&3WNbhTGIqjg0ACBBDgGl$neUV~)GoJq53W?74{=ixIWI!xP>7v)w`}}3(UZh>So1&wziR9s7 zSA}IYW|jGN49`9iH!ZVE!{M$tg*l?7kkhGn)y|m2QLjT;nS!QYi}c-xu~F1J-Gndx z@DbOg?TFMU1t!zeA|&0hqaxfhJt;fcRKq8^J&vyW-c0`%zXVOFX%Ga~=iqXfipY|K z*w7}r?d*&tRiS1)o0wt1jJpx51n;&b<>f{Cd#GT2jkE;98lB4XboU;^C7)HI+8#{1KW2UDhTe^2XrWyy|yND`g-8Uo2&d|Hv&e$ zxxYA9b(5`wJ8~gol{e`YeYG5quV+~ry zX~otmSd(oW$MP<>amxS9M?~8fOnw?-`d{0P5VF+N)ChEqxp25a?oyqg9%UendV|$h zT}hn9MA6%S``wpefpWL!svof83{-IOBOIq?F8w>5KjE+g zX~dDTBP|%(!q=WGJ^$)y??1ljn=shUOlWigglp{Rojag1CPjm_l(FajBLV(DqO?0_ z6DC2^vmv9_9?~Mq(^$^|y37SGN_lN2_~n7K+OQes<9A>a)k$_;vk=S5&*Bv+B*K)1N*k3`!8sb7yr&qf zu{*-)AD)(-T0LXNO!}OucYT3=JQFqb^V7(z}5-JxB{iCp-^j zU2W)V&|1HM*kLkeKRb@FnzdLNG(zouJkS_|&}bIEAHViu*?BkK^>NLZm9XC9uf z|I(PZsyG@5L+Yxsh9#upHlaSXSXppw(+60N>aTX{L*PHM?*6Ug z56y5R0$^j6zmKb3(!p*t-Qs9#-BOY>J$*d9t4EG44WUOcHl>21E>#)1X+Tz1e3L)Y zlaiFK5t&(WEWIPli}p@R92S-W%Q=T58CjHeQ z%+zBGx~Ha+h>A9MEs~~bXB`vp^_|d>IwINka!;D$D?rOIqmeD=^`A?z{2Zu!rM|d) zVG1vf08z{HBq=y9%U9d$Qjk4IsRWqMOUroyc<2?tmIy2US8(){L)eT4X+$SDI9{v| z*3L$JWiuX2cI%#}jRj^+&43oU2QHy<+;X?xxT^&|2?@*18OW za~CwoD{(H1vOD+G`jfr|bkp2U($-%(Nc(b=v$OHr0g#bh!C;1(Y=%$PEK6Vc%fv&s zKL6I;Hi4Z1cC&9dN_o;`k=kxjA0X-hAz9k+p;;;WP~@|Vg%y9mhGB`v)uE?=wh;F; zf2i>f7kO?GI4mM&P#J7G`KJ)xGyw~LhBsLATq52VvEbto!uBqrEmj7+kxPU7zLz?T zJnI=ahHe3*^E@vypP)8;E_Tmb5#cZtZF#aO?0q5e`yZ=9gK6Hp0NQsZ)V19fQ(5%X zn(qz}I@4e3`!U}!`+UKZV>COAHT5;UQ{CI~eX~G5=Dh#;Kgk^8`WLsY@Ro~8A;_-NlXwSm5bUO+L(DVf`-SUudQEO${MVzj_8-gasINY~HK!yb2 zm6?o~Yfy`t0a;O_s#%)t;$97{^L`2*ke2oOzceUB-W2;HSAo`G7K|#A&_n^EoZc(h zL98sQE)q!#sLXUsjvJum3iuj=6sher#p8j)BVasPt4E(AFbfHxjAj)~!e=o+S>F

Z5%j-C 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%0A=e`l9AQljxQ1J>rUJsDX<`+@ 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 diff --git a/vendor/guzzlehttp/guzzle/docs/_templates/nav_links.html b/vendor/guzzlehttp/guzzle/docs/_templates/nav_links.html deleted file mode 100644 index 7950a0f8..00000000 --- a/vendor/guzzlehttp/guzzle/docs/_templates/nav_links.html +++ /dev/null @@ -1,3 +0,0 @@ -

  • GitHub
  • -
  • Forum
  • -
  • IRC
  • diff --git a/vendor/guzzlehttp/guzzle/docs/clients.rst b/vendor/guzzlehttp/guzzle/docs/clients.rst deleted file mode 100644 index 35a9806f..00000000 --- a/vendor/guzzlehttp/guzzle/docs/clients.rst +++ /dev/null @@ -1,1326 +0,0 @@ -======= -Clients -======= - -Clients are used to create requests, create transactions, send requests -through an HTTP handler, and return a response. You can add default request -options to a client that are applied to every request (e.g., default headers, -default query string parameters, etc.), and you can add event listeners and -subscribers to every request created by a client. - -Creating a client -================= - -The constructor of a client accepts an associative array of configuration -options. - -base_url - Configures a base URL for the client so that requests created - using a relative URL are combined with the ``base_url`` of the client - according to section `5.2 of RFC 3986 `_. - - .. code-block:: php - - // Create a client with a base URL - $client = new GuzzleHttp\Client(['base_url' => 'https://github.com']); - // Send a request to https://github.com/notifications - $response = $client->get('/notifications'); - - Don't feel like reading RFC 3986? Here are some quick examples on how a - ``base_url`` is resolved with another URI. - - ======================= ================== =============================== - base_url URI Result - ======================= ================== =============================== - ``http://foo.com`` ``/bar`` ``http://foo.com/bar`` - ``http://foo.com/foo`` ``/bar`` ``http://foo.com/bar`` - ``http://foo.com/foo`` ``bar`` ``http://foo.com/bar`` - ``http://foo.com/foo/`` ``bar`` ``http://foo.com/foo/bar`` - ``http://foo.com`` ``http://baz.com`` ``http://baz.com`` - ``http://foo.com/?bar`` ``bar`` ``http://foo.com/bar`` - ======================= ================== =============================== - -handler - Configures the `RingPHP handler `_ - used to transfer the HTTP requests of a client. Guzzle will, by default, - utilize a stacked handlers that chooses the best handler to use based on the - provided request options and based on the extensions available in the - environment. - -message_factory - Specifies the factory used to create HTTP requests and responses - (``GuzzleHttp\Message\MessageFactoryInterface``). - -defaults - Associative array of :ref:`request-options` that are applied to every - request created by the client. This allows you to specify things like - default headers (e.g., User-Agent), default query string parameters, SSL - configurations, and any other supported request options. - -emitter - Specifies an event emitter (``GuzzleHttp\Event\EmitterInterface``) instance - to be used by the client to emit request events. This option is useful if - you need to inject an emitter with listeners/subscribers already attached. - -Here's an example of creating a client with various options. - -.. code-block:: php - - use GuzzleHttp\Client; - - $client = new Client([ - 'base_url' => ['https://api.twitter.com/{version}/', ['version' => 'v1.1']], - 'defaults' => [ - 'headers' => ['Foo' => 'Bar'], - 'query' => ['testing' => '123'], - 'auth' => ['username', 'password'], - 'proxy' => 'tcp://localhost:80' - ] - ]); - -Sending Requests -================ - -Requests can be created using various methods of a client. You can create -**and** send requests using one of the following methods: - -- ``GuzzleHttp\Client::get``: Sends a GET request. -- ``GuzzleHttp\Client::head``: Sends a HEAD request -- ``GuzzleHttp\Client::post``: Sends a POST request -- ``GuzzleHttp\Client::put``: Sends a PUT request -- ``GuzzleHttp\Client::delete``: Sends a DELETE request -- ``GuzzleHttp\Client::options``: Sends an OPTIONS request - -Each of the above methods accepts a URL as the first argument and an optional -associative array of :ref:`request-options` as the second argument. - -Synchronous Requests --------------------- - -Guzzle sends synchronous (blocking) requests when the ``future`` request option -is not specified. This means that the request will complete immediately, and if -an error is encountered, a ``GuzzleHttp\Exception\RequestException`` will be -thrown. - -.. code-block:: php - - $client = new GuzzleHttp\Client(); - - $client->put('http://httpbin.org', [ - 'headers' => ['X-Foo' => 'Bar'], - 'body' => 'this is the body!', - 'save_to' => '/path/to/local/file', - 'allow_redirects' => false, - 'timeout' => 5 - ]); - -Synchronous Error Handling -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When a recoverable error is encountered while calling the ``send()`` method of -a client, a ``GuzzleHttp\Exception\RequestException`` is thrown. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Exception\RequestException; - - $client = new Client(); - - try { - $client->get('http://httpbin.org'); - } catch (RequestException $e) { - echo $e->getRequest() . "\n"; - if ($e->hasResponse()) { - echo $e->getResponse() . "\n"; - } - } - -``GuzzleHttp\Exception\RequestException`` always contains a -``GuzzleHttp\Message\RequestInterface`` object that can be accessed using the -exception's ``getRequest()`` method. - -A response might be present in the exception. In the event of a networking -error, no response will be received. You can check if a ``RequestException`` -has a response using the ``hasResponse()`` method. If the exception has a -response, then you can access the associated -``GuzzleHttp\Message\ResponseInterface`` using the ``getResponse()`` method of -the exception. - -Asynchronous Requests ---------------------- - -You can send asynchronous requests by setting the ``future`` request option -to ``true`` (or a string that your handler understands). This creates a -``GuzzleHttp\Message\FutureResponse`` object that has not yet completed. Once -you have a future response, you can use a promise object obtained by calling -the ``then`` method of the response to take an action when the response has -completed or encounters an error. - -.. code-block:: php - - $response = $client->put('http://httpbin.org/get', ['future' => true]); - - // Call the function when the response completes - $response->then(function ($response) { - echo $response->getStatusCode(); - }); - -You can call the ``wait()`` method of a future response to block until it has -completed. You also use a future response object just like a normal response -object by accessing the methods of the response. Using a future response like a -normal response object, also known as *dereferencing*, will block until the -response has completed. - -.. code-block:: php - - $response = $client->put('http://httpbin.org/get', ['future' => true]); - - // Block until the response has completed - echo $response->getStatusCode(); - -.. important:: - - If an exception occurred while transferring the future response, then the - exception encountered will be thrown when dereferencing. - -.. note:: - - It depends on the RingPHP handler used by a client, but you typically need - to use the same RingPHP handler in order to utilize asynchronous requests - across multiple clients. - -Asynchronous Error Handling -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Handling errors with future response object promises is a bit different. When -using a promise, exceptions are forwarded to the ``$onError`` function provided -to the second argument of the ``then()`` function. - -.. code-block:: php - - $response = $client->put('http://httpbin.org/get', ['future' => true]); - - $response - ->then( - function ($response) { - // This is called when the request succeeded - echo 'Success: ' . $response->getStatusCode(); - // Returning a value will forward the value to the next promise - // in the chain. - return $response; - }, - function ($error) { - // This is called when the exception failed. - echo 'Exception: ' . $error->getMessage(); - // Throwing will "forward" the exception to the next promise - // in the chain. - throw $error; - } - ) - ->then( - function($response) { - // This is called after the first promise in the chain. It - // receives the value returned from the first promise. - echo $response->getReasonPhrase(); - }, - function ($error) { - // This is called if the first promise error handler in the - // chain rethrows the exception. - echo 'Error: ' . $error->getMessage(); - } - ); - -Please see the `React/Promises project documentation `_ -for more information on how promise resolution and rejection forwarding works. - -HTTP Errors ------------ - -If the ``exceptions`` request option is not set to ``false``, then exceptions -are thrown for HTTP protocol errors as well: -``GuzzleHttp\Exception\ClientErrorResponseException`` for 4xx level HTTP -responses and ``GuzzleHttp\Exception\ServerException`` for 5xx level responses, -both of which extend from ``GuzzleHttp\Exception\BadResponseException``. - -Creating Requests ------------------ - -You can create a request without sending it. This is useful for building up -requests over time or sending requests in concurrently. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httpbin.org', [ - 'headers' => ['X-Foo' => 'Bar'] - ]); - - // Modify the request as needed - $request->setHeader('Baz', 'bar'); - -After creating a request, you can send it with the client's ``send()`` method. - -.. code-block:: php - - $response = $client->send($request); - -Sending Requests With a Pool -============================ - -You can send requests concurrently using a fixed size pool via the -``GuzzleHttp\Pool`` class. The Pool class is an implementation of -``GuzzleHttp\Ring\Future\FutureInterface``, meaning it can be dereferenced at a -later time or cancelled before sending. The Pool constructor accepts a client -object, iterator or array that yields ``GuzzleHttp\Message\RequestInterface`` -objects, and an optional associative array of options that can be used to -affect the transfer. - -.. code-block:: php - - use GuzzleHttp\Pool; - - $requests = [ - $client->createRequest('GET', 'http://httpbin.org'), - $client->createRequest('DELETE', 'http://httpbin.org/delete'), - $client->createRequest('PUT', 'http://httpbin.org/put', ['body' => 'test']) - ]; - - $options = []; - - // Create a pool. Note: the options array is optional. - $pool = new Pool($client, $requests, $options); - - // Send the requests - $pool->wait(); - -The Pool constructor accepts the following associative array of options: - -- **pool_size**: Integer representing the maximum number of requests that are - allowed to be sent concurrently. -- **before**: Callable or array representing the event listeners to add to - each request's :ref:`before_event` event. -- **complete**: Callable or array representing the event listeners to add to - each request's :ref:`complete_event` event. -- **error**: Callable or array representing the event listeners to add to - each request's :ref:`error_event` event. -- **end**: Callable or array representing the event listeners to add to - each request's :ref:`end_event` event. - -The "before", "complete", "error", and "end" event options accept a callable or -an array of associative arrays where each associative array contains a "fn" key -with a callable value, an optional "priority" key representing the event -priority (with a default value of 0), and an optional "once" key that can be -set to true so that the event listener will be removed from the request after -it is first triggered. - -.. code-block:: php - - use GuzzleHttp\Pool; - use GuzzleHttp\Event\CompleteEvent; - - // Add a single event listener using a callable. - Pool::send($client, $requests, [ - 'complete' => function (CompleteEvent $event) { - echo 'Completed request to ' . $event->getRequest()->getUrl() . "\n"; - echo 'Response: ' . $event->getResponse()->getBody() . "\n\n"; - } - ]); - - // The above is equivalent to the following, but the following structure - // allows you to add multiple event listeners to the same event name. - Pool::send($client, $requests, [ - 'complete' => [ - [ - 'fn' => function (CompleteEvent $event) { /* ... */ }, - 'priority' => 0, // Optional - 'once' => false // Optional - ] - ] - ]); - -Asynchronous Response Handling ------------------------------- - -When sending requests concurrently using a pool, the request/response/error -lifecycle must be handled asynchronously. This means that you give the Pool -multiple requests and handle the response or errors that is associated with the -request using event callbacks. - -.. code-block:: php - - use GuzzleHttp\Pool; - use GuzzleHttp\Event\ErrorEvent; - - Pool::send($client, $requests, [ - 'complete' => function (CompleteEvent $event) { - echo 'Completed request to ' . $event->getRequest()->getUrl() . "\n"; - echo 'Response: ' . $event->getResponse()->getBody() . "\n\n"; - // Do something with the completion of the request... - }, - 'error' => function (ErrorEvent $event) { - echo 'Request failed: ' . $event->getRequest()->getUrl() . "\n"; - echo $event->getException(); - // Do something to handle the error... - } - ]); - -The ``GuzzleHttp\Event\ErrorEvent`` event object is emitted when an error -occurs during a transfer. With this event, you have access to the request that -was sent, the response that was received (if one was received), access to -transfer statistics, and the ability to intercept the exception with a -different ``GuzzleHttp\Message\ResponseInterface`` object. See :doc:`events` -for more information. - -Handling Errors After Transferring -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It sometimes might be easier to handle all of the errors that occurred during a -transfer after all of the requests have been sent. Here we are adding each -failed request to an array that we can use to process errors later. - -.. code-block:: php - - use GuzzleHttp\Pool; - use GuzzleHttp\Event\ErrorEvent; - - $errors = []; - Pool::send($client, $requests, [ - 'error' => function (ErrorEvent $event) use (&$errors) { - $errors[] = $event; - } - ]); - - foreach ($errors as $error) { - // Handle the error... - } - -.. _batch-requests: - -Batching Requests ------------------ - -Sometimes you just want to send a few requests concurrently and then process -the results all at once after they've been sent. Guzzle provides a convenience -function ``GuzzleHttp\Pool::batch()`` that makes this very simple: - -.. code-block:: php - - use GuzzleHttp\Pool; - use GuzzleHttp\Client; - - $client = new Client(); - - $requests = [ - $client->createRequest('GET', 'http://httpbin.org/get'), - $client->createRequest('HEAD', 'http://httpbin.org/get'), - $client->createRequest('PUT', 'http://httpbin.org/put'), - ]; - - // Results is a GuzzleHttp\BatchResults object. - $results = Pool::batch($client, $requests); - - // Can be accessed by index. - echo $results[0]->getStatusCode(); - - // Can be accessed by request. - echo $results->getResult($requests[0])->getStatusCode(); - - // Retrieve all successful responses - foreach ($results->getSuccessful() as $response) { - echo $response->getStatusCode() . "\n"; - } - - // Retrieve all failures. - foreach ($results->getFailures() as $requestException) { - echo $requestException->getMessage() . "\n"; - } - -``GuzzleHttp\Pool::batch()`` accepts an optional associative array of options -in the third argument that allows you to specify the 'before', 'complete', -'error', and 'end' events as well as specify the maximum number of requests to -send concurrently using the 'pool_size' option key. - -.. _request-options: - -Request Options -=============== - -You can customize requests created by a client using **request options**. -Request options control various aspects of a request including, headers, -query string parameters, timeout settings, the body of a request, and much -more. - -All of the following examples use the following client: - -.. code-block:: php - - $client = new GuzzleHttp\Client(['base_url' => 'http://httpbin.org']); - -headers -------- - -:Summary: Associative array of headers to add to the request. Each key is the - name of a header, and each value is a string or array of strings - representing the header field values. -:Types: array -:Defaults: None - -.. code-block:: php - - // Set various headers on a request - $client->get('/get', [ - 'headers' => [ - 'User-Agent' => 'testing/1.0', - 'Accept' => 'application/json', - 'X-Foo' => ['Bar', 'Baz'] - ] - ]); - -body ----- - -:Summary: The ``body`` option is used to control the body of an entity - enclosing request (e.g., PUT, POST, PATCH). -:Types: - - string - - ``fopen()`` resource - - ``GuzzleHttp\Stream\StreamInterface`` - - ``GuzzleHttp\Post\PostBodyInterface`` -:Default: None - -This setting can be set to any of the following types: - -- string - - .. code-block:: php - - // You can send requests that use a string as the message body. - $client->put('/put', ['body' => 'foo']); - -- resource returned from ``fopen()`` - - .. code-block:: php - - // You can send requests that use a stream resource as the body. - $resource = fopen('http://httpbin.org', 'r'); - $client->put('/put', ['body' => $resource]); - -- Array - - Use an array to send POST style requests that use a - ``GuzzleHttp\Post\PostBodyInterface`` object as the body. - - .. code-block:: php - - // You can send requests that use a POST body containing fields & files. - $client->post('/post', [ - 'body' => [ - 'field' => 'abc', - 'other_field' => '123', - 'file_name' => fopen('/path/to/file', 'r') - ] - ]); - -- ``GuzzleHttp\Stream\StreamInterface`` - - .. code-block:: php - - // You can send requests that use a Guzzle stream object as the body - $stream = GuzzleHttp\Stream\Stream::factory('contents...'); - $client->post('/post', ['body' => $stream]); - -json ----- - -:Summary: The ``json`` option is used to easily upload JSON encoded data as the - body of a request. A Content-Type header of ``application/json`` will be - added if no Content-Type header is already present on the message. -:Types: - Any PHP type that can be operated on by PHP's ``json_encode()`` function. -:Default: None - -.. code-block:: php - - $request = $client->createRequest('PUT', '/put', ['json' => ['foo' => 'bar']]); - echo $request->getHeader('Content-Type'); - // application/json - echo $request->getBody(); - // {"foo":"bar"} - -.. note:: - - This request option does not support customizing the Content-Type header - or any of the options from PHP's `json_encode() `_ - function. If you need to customize these settings, then you must pass the - JSON encoded data into the request yourself using the ``body`` request - option and you must specify the correct Content-Type header using the - ``headers`` request option. - -query ------ - -:Summary: Associative array of query string values to add to the request. -:Types: - - array - - ``GuzzleHttp\Query`` -:Default: None - -.. code-block:: php - - // Send a GET request to /get?foo=bar - $client->get('/get', ['query' => ['foo' => 'bar']]); - -Query strings specified in the ``query`` option are combined with any query -string values that are parsed from the URL. - -.. code-block:: php - - // Send a GET request to /get?abc=123&foo=bar - $client->get('/get?abc=123', ['query' => ['foo' => 'bar']]); - -auth ----- - -:Summary: Pass an array of HTTP authentication parameters to use with the - request. The array must contain the username in index [0], the password in - index [1], and you can optionally provide a built-in authentication type in - index [2]. Pass ``null`` to disable authentication for a request. -:Types: - - array - - string - - null -:Default: None - -The built-in authentication types are as follows: - -basic - Use `basic HTTP authentication `_ in - the ``Authorization`` header (the default setting used if none is - specified). - - .. code-block:: php - - $client->get('/get', ['auth' => ['username', 'password']]); - -digest - Use `digest authentication `_ (must be - supported by the HTTP handler). - - .. code-block:: php - - $client->get('/get', ['auth' => ['username', 'password', 'digest']]); - - *This is currently only supported when using the cURL handler, but creating - a replacement that can be used with any HTTP handler is planned.* - -.. important:: - - The authentication type (whether it's provided as a string or as the third - option in an array) is always converted to a lowercase string. Take this - into account when implementing custom authentication types and when - implementing custom message factories. - -Custom Authentication Schemes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -You can also provide a string representing a custom authentication type name. -When using a custom authentication type string, you will need to implement -the authentication method in an event listener that checks the ``auth`` request -option of a request before it is sent. Authentication listeners that require -a request is not modified after they are signed should have a very low priority -to ensure that they are fired last or near last in the event chain. - -.. code-block:: php - - use GuzzleHttp\Event\BeforeEvent; - use GuzzleHttp\Event\RequestEvents; - - /** - * Custom authentication listener that handles the "foo" auth type. - * - * Listens to the "before" event of a request and only modifies the request - * when the "auth" config setting of the request is "foo". - */ - class FooAuth implements GuzzleHttp\Event\SubscriberInterface - { - private $password; - - public function __construct($password) - { - $this->password = $password; - } - - public function getEvents() - { - return ['before' => ['sign', RequestEvents::SIGN_REQUEST]]; - } - - public function sign(BeforeEvent $e) - { - if ($e->getRequest()->getConfig()['auth'] == 'foo') { - $e->getRequest()->setHeader('X-Foo', 'Foo ' . $this->password); - } - } - } - - $client->getEmitter()->attach(new FooAuth('password')); - $client->get('/', ['auth' => 'foo']); - -Adapter Specific Authentication Schemes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If you need to use authentication methods provided by cURL (e.g., NTLM, GSS, -etc.), then you need to specify a curl handler option in the ``options`` -request option array. See :ref:`config-option` for more information. - -.. _cookies-option: - -cookies -------- - -:Summary: Specifies whether or not cookies are used in a request or what cookie - jar to use or what cookies to send. -:Types: - - bool - - array - - ``GuzzleHttp\Cookie\CookieJarInterface`` -:Default: None - -Set to ``true`` to use a shared cookie session associated with the client. - -.. code-block:: php - - // Enable cookies using the shared cookie jar of the client. - $client->get('/get', ['cookies' => true]); - -Pass an associative array containing cookies to send in the request and start a -new cookie session. - -.. code-block:: php - - // Enable cookies and send specific cookies - $client->get('/get', ['cookies' => ['foo' => 'bar']]); - -Set to a ``GuzzleHttp\Cookie\CookieJarInterface`` object to use an existing -cookie jar. - -.. code-block:: php - - $jar = new GuzzleHttp\Cookie\CookieJar(); - $client->get('/get', ['cookies' => $jar]); - -.. _allow_redirects-option: - -allow_redirects ---------------- - -:Summary: Describes the redirect behavior of a request -:Types: - - bool - - array -:Default: - :: - - [ - 'max' => 5, - 'strict' => false, - 'referer' => true, - 'protocols' => ['http', 'https'] - ] - -Set to ``false`` to disable redirects. - -.. code-block:: php - - $res = $client->get('/redirect/3', ['allow_redirects' => false]); - echo $res->getStatusCode(); - // 302 - -Set to ``true`` (the default setting) to enable normal redirects with a maximum -number of 5 redirects. - -.. code-block:: php - - $res = $client->get('/redirect/3'); - echo $res->getStatusCode(); - // 200 - -Pass an associative array containing the 'max' key to specify the maximum -number of redirects, provide a 'strict' key value to specify whether or not to -use strict RFC compliant redirects (meaning redirect POST requests with POST -requests vs. doing what most browsers do which is redirect POST requests with -GET requests), provide a 'referer' key to specify whether or not the "Referer" -header should be added when redirecting, and provide a 'protocols' array that -specifies which protocols are supported for redirects (defaults to -``['http', 'https']``). - -.. code-block:: php - - $res = $client->get('/redirect/3', [ - 'allow_redirects' => [ - 'max' => 10, // allow at most 10 redirects. - 'strict' => true, // use "strict" RFC compliant redirects. - 'referer' => true, // add a Referer header - 'protocols' => ['https'] // only allow https URLs - ] - ]); - echo $res->getStatusCode(); - // 200 - -decode_content --------------- - -:Summary: Specify whether or not ``Content-Encoding`` responses (gzip, - deflate, etc.) are automatically decoded. -:Types: - - string - - bool -:Default: ``true`` - -This option can be used to control how content-encoded response bodies are -handled. By default, ``decode_content`` is set to true, meaning any gzipped -or deflated response will be decoded by Guzzle. - -When set to ``false``, the body of a response is never decoded, meaning the -bytes pass through the handler unchanged. - -.. code-block:: php - - // Request gzipped data, but do not decode it while downloading - $client->get('/foo.js', [ - 'headers' => ['Accept-Encoding' => 'gzip'], - 'decode_content' => false - ]); - -When set to a string, the bytes of a response are decoded and the string value -provided to the ``decode_content`` option is passed as the ``Accept-Encoding`` -header of the request. - -.. code-block:: php - - // Pass "gzip" as the Accept-Encoding header. - $client->get('/foo.js', ['decode_content' => 'gzip']); - -.. _save_to-option: - -save_to -------- - -:Summary: Specify where the body of a response will be saved. -:Types: - - string - - ``fopen()`` resource - - ``GuzzleHttp\Stream\StreamInterface`` -:Default: PHP temp stream - -Pass a string to specify the path to a file that will store the contents of the -response body: - -.. code-block:: php - - $client->get('/stream/20', ['save_to' => '/path/to/file']); - -Pass a resource returned from ``fopen()`` to write the response to a PHP stream: - -.. code-block:: php - - $resource = fopen('/path/to/file', 'w'); - $client->get('/stream/20', ['save_to' => $resource]); - -Pass a ``GuzzleHttp\Stream\StreamInterface`` object to stream the response body -to an open Guzzle stream: - -.. code-block:: php - - $resource = fopen('/path/to/file', 'w'); - $stream = GuzzleHttp\Stream\Stream::factory($resource); - $client->get('/stream/20', ['save_to' => $stream]); - -.. _events-option: - -events ------- - -:Summary: An associative array mapping event names to a callable. Or an - associative array containing the 'fn' key that maps to a callable, an - optional 'priority' key used to specify the event priority, and an optional - 'once' key used to specify if the event should remove itself the first time - it is triggered. -:Types: array -:Default: None - -.. code-block:: php - - use GuzzleHttp\Event\BeforeEvent; - use GuzzleHttp\Event\HeadersEvent; - use GuzzleHttp\Event\CompleteEvent; - use GuzzleHttp\Event\ErrorEvent; - - $client->get('/', [ - 'events' => [ - 'before' => function (BeforeEvent $e) { echo 'Before'; }, - 'complete' => function (CompleteEvent $e) { echo 'Complete'; }, - 'error' => function (ErrorEvent $e) { echo 'Error'; }, - ] - ]); - -Here's an example of using the associative array format for control over the -priority and whether or not an event should be triggered more than once. - -.. code-block:: php - - $client->get('/', [ - 'events' => [ - 'before' => [ - 'fn' => function (BeforeEvent $e) { echo 'Before'; }, - 'priority' => 100, - 'once' => true - ] - ] - ]); - -.. _subscribers-option: - -subscribers ------------ - -:Summary: Array of event subscribers to add to the request. Each value in the - array must be an instance of ``GuzzleHttp\Event\SubscriberInterface``. -:Types: array -:Default: None - -.. code-block:: php - - use GuzzleHttp\Subscriber\History; - use GuzzleHttp\Subscriber\Mock; - use GuzzleHttp\Message\Response; - - $history = new History(); - $mock = new Mock([new Response(200)]); - $client->get('/', ['subscribers' => [$history, $mock]]); - - echo $history; - // Outputs the request and response history - -.. _exceptions-option: - -exceptions ----------- - -:Summary: Set to ``false`` to disable throwing exceptions on an HTTP protocol - errors (i.e., 4xx and 5xx responses). Exceptions are thrown by default when - HTTP protocol errors are encountered. -:Types: bool -:Default: ``true`` - -.. code-block:: php - - $client->get('/status/500'); - // Throws a GuzzleHttp\Exception\ServerException - - $res = $client->get('/status/500', ['exceptions' => false]); - echo $res->getStatusCode(); - // 500 - -.. _timeout-option: - -timeout -------- - -:Summary: Float describing the timeout of the request in seconds. Use ``0`` - to wait indefinitely (the default behavior). -:Types: float -:Default: ``0`` - -.. code-block:: php - - // Timeout if a server does not return a response in 3.14 seconds. - $client->get('/delay/5', ['timeout' => 3.14]); - // PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\RequestException' - -.. _connect_timeout-option: - -connect_timeout ---------------- - -:Summary: Float describing the number of seconds to wait while trying to connect - to a server. Use ``0`` to wait indefinitely (the default behavior). -:Types: float -:Default: ``0`` - -.. code-block:: php - - // Timeout if the client fails to connect to the server in 3.14 seconds. - $client->get('/delay/5', ['connect_timeout' => 3.14]); - -.. note:: - - This setting must be supported by the HTTP handler used to send a request. - ``connect_timeout`` is currently only supported by the built-in cURL - handler. - -.. _verify-option: - -verify ------- - -:Summary: Describes the SSL certificate verification behavior of a request. - - - Set to ``true`` to enable SSL certificate verification and use the default - CA bundle provided by operating system. - - Set to ``false`` to disable certificate verification (this is insecure!). - - Set to a string to provide the path to a CA bundle to enable verification - using a custom certificate. -:Types: - - bool - - string -:Default: ``true`` - -.. code-block:: php - - // Use the system's CA bundle (this is the default setting) - $client->get('/', ['verify' => true]); - - // Use a custom SSL certificate on disk. - $client->get('/', ['verify' => '/path/to/cert.pem']); - - // Disable validation entirely (don't do this!). - $client->get('/', ['verify' => false]); - -Not all system's have a known CA bundle on disk. For example, Windows and -OS X do not have a single common location for CA bundles. When setting -"verify" to ``true``, Guzzle will do its best to find the most appropriate -CA bundle on your system. When using cURL or the PHP stream wrapper on PHP -versions >= 5.6, this happens by default. When using the PHP stream -wrapper on versions < 5.6, Guzzle tries to find your CA bundle in the -following order: - -1. Check if ``openssl.cafile`` is set in your php.ini file. -2. Check if ``curl.cainfo`` is set in your php.ini file. -3. Check if ``/etc/pki/tls/certs/ca-bundle.crt`` exists (Red Hat, CentOS, - Fedora; provided by the ca-certificates package) -4. Check if ``/etc/ssl/certs/ca-certificates.crt`` exists (Ubuntu, Debian; - provided by the ca-certificates package) -5. Check if ``/usr/local/share/certs/ca-root-nss.crt`` exists (FreeBSD; - provided by the ca_root_nss package) -6. Check if ``/usr/local/etc/openssl/cert.pem`` (OS X; provided by homebrew) -7. Check if ``C:\windows\system32\curl-ca-bundle.crt`` exists (Windows) -8. Check if ``C:\windows\curl-ca-bundle.crt`` exists (Windows) - -The result of this lookup is cached in memory so that subsequent calls -in the same process will return very quickly. However, when sending only -a single request per-process in something like Apache, you should consider -setting the ``openssl.cafile`` environment variable to the path on disk -to the file so that this entire process is skipped. - -If you do not need a specific certificate bundle, then Mozilla provides a -commonly used CA bundle which can be downloaded -`here `_ -(provided by the maintainer of cURL). Once you have a CA bundle available on -disk, you can set the "openssl.cafile" PHP ini setting to point to the path to -the file, allowing you to omit the "verify" request option. Much more detail on -SSL certificates can be found on the -`cURL website `_. - -.. _cert-option: - -cert ----- - -:Summary: Set to a string to specify the path to a file containing a PEM - formatted client side certificate. If a password is required, then set to - an array containing the path to the PEM file in the first array element - followed by the password required for the certificate in the second array - element. -:Types: - - string - - array -:Default: None - -.. code-block:: php - - $client->get('/', ['cert' => ['/path/server.pem', 'password']]); - -.. _ssl_key-option: - -ssl_key -------- - -:Summary: Specify the path to a file containing a private SSL key in PEM - format. If a password is required, then set to an array containing the path - to the SSL key in the first array element followed by the password required - for the certificate in the second element. -:Types: - - string - - array -:Default: None - -.. note:: - - ``ssl_key`` is implemented by HTTP handlers. This is currently only - supported by the cURL handler, but might be supported by other third-part - handlers. - -.. _proxy-option: - -proxy ------ - -:Summary: Pass a string to specify an HTTP proxy, or an array to specify - different proxies for different protocols. -:Types: - - string - - array -:Default: None - -Pass a string to specify a proxy for all protocols. - -.. code-block:: php - - $client->get('/', ['proxy' => 'tcp://localhost:8125']); - -Pass an associative array to specify HTTP proxies for specific URI schemes -(i.e., "http", "https"). - -.. code-block:: php - - $client->get('/', [ - 'proxy' => [ - 'http' => 'tcp://localhost:8125', // Use this proxy with "http" - 'https' => 'tcp://localhost:9124' // Use this proxy with "https" - ] - ]); - -.. note:: - - You can provide proxy URLs that contain a scheme, username, and password. - For example, ``"http://username:password@192.168.16.1:10"``. - -.. _debug-option: - -debug ------ - -:Summary: Set to ``true`` or set to a PHP stream returned by ``fopen()`` to - enable debug output with the handler used to send a request. For example, - when using cURL to transfer requests, cURL's verbose of ``CURLOPT_VERBOSE`` - will be emitted. When using the PHP stream wrapper, stream wrapper - notifications will be emitted. If set to true, the output is written to - PHP's STDOUT. If a PHP stream is provided, output is written to the stream. -:Types: - - bool - - ``fopen()`` resource -:Default: None - -.. code-block:: php - - $client->get('/get', ['debug' => true]); - -Running the above example would output something like the following: - -:: - - * About to connect() to httpbin.org port 80 (#0) - * Trying 107.21.213.98... * Connected to httpbin.org (107.21.213.98) port 80 (#0) - > GET /get HTTP/1.1 - Host: httpbin.org - User-Agent: Guzzle/4.0 curl/7.21.4 PHP/5.5.7 - - < HTTP/1.1 200 OK - < Access-Control-Allow-Origin: * - < Content-Type: application/json - < Date: Sun, 16 Feb 2014 06:50:09 GMT - < Server: gunicorn/0.17.4 - < Content-Length: 335 - < Connection: keep-alive - < - * Connection #0 to host httpbin.org left intact - -.. _stream-option: - -stream ------- - -:Summary: Set to ``true`` to stream a response rather than download it all - up-front. -:Types: bool -:Default: ``false`` - -.. code-block:: php - - $response = $client->get('/stream/20', ['stream' => true]); - // Read bytes off of the stream until the end of the stream is reached - $body = $response->getBody(); - while (!$body->eof()) { - echo $body->read(1024); - } - -.. note:: - - Streaming response support must be implemented by the HTTP handler used by - a client. This option might not be supported by every HTTP handler, but the - interface of the response object remains the same regardless of whether or - not it is supported by the handler. - -.. _expect-option: - -expect ------- - -:Summary: Controls the behavior of the "Expect: 100-Continue" header. -:Types: - - bool - - integer -:Default: ``1048576`` - -Set to ``true`` to enable the "Expect: 100-Continue" header for all requests -that sends a body. Set to ``false`` to disable the "Expect: 100-Continue" -header for all requests. Set to a number so that the size of the payload must -be greater than the number in order to send the Expect header. Setting to a -number will send the Expect header for all requests in which the size of the -payload cannot be determined or where the body is not rewindable. - -By default, Guzzle will add the "Expect: 100-Continue" header when the size of -the body of a request is greater than 1 MB and a request is using HTTP/1.1. - -.. note:: - - This option only takes effect when using HTTP/1.1. The HTTP/1.0 and - HTTP/2.0 protocols do not support the "Expect: 100-Continue" header. - Support for handling the "Expect: 100-Continue" workflow must be - implemented by Guzzle HTTP handlers used by a client. - -.. _version-option: - -version -------- - -:Summary: Protocol version to use with the request. -:Types: string, float -:Default: ``1.1`` - -.. code-block:: php - - // Force HTTP/1.0 - $request = $client->createRequest('GET', '/get', ['version' => 1.0]); - echo $request->getProtocolVersion(); - // 1.0 - -.. _config-option: - -config ------- - -:Summary: Associative array of config options that are forwarded to a request's - configuration collection. These values are used as configuration options - that can be consumed by plugins and handlers. -:Types: array -:Default: None - -.. code-block:: php - - $request = $client->createRequest('GET', '/get', ['config' => ['foo' => 'bar']]); - echo $request->getConfig('foo'); - // 'bar' - -Some HTTP handlers allow you to specify custom handler-specific settings. For -example, you can pass custom cURL options to requests by passing an associative -array in the ``config`` request option under the ``curl`` key. - -.. code-block:: php - - // Use custom cURL options with the request. This example uses NTLM auth - // to authenticate with a server. - $client->get('/', [ - 'config' => [ - 'curl' => [ - CURLOPT_HTTPAUTH => CURLAUTH_NTLM, - CURLOPT_USERPWD => 'username:password' - ] - ] - ]); - -future ------- - -:Summary: Specifies whether or not a response SHOULD be an instance of a - ``GuzzleHttp\Message\FutureResponse`` object. -:Types: - - bool - - string -:Default: ``false`` - -By default, Guzzle requests should be synchronous. You can create asynchronous -future responses by passing the ``future`` request option as ``true``. The -response will only be executed when it is used like a normal response, the -``wait()`` method of the response is called, or the corresponding handler that -created the response is destructing and there are futures that have not been -resolved. - -.. important:: - - This option only has an effect if your handler can create and return future - responses. However, even if a response is completed synchronously, Guzzle - will ensure that a FutureResponse object is returned for API consistency. - -.. code-block:: php - - $response = $client->get('/foo', ['future' => true]) - ->then(function ($response) { - echo 'I got a response! ' . $response; - }); - -Event Subscribers -================= - -Requests emit lifecycle events when they are transferred. A client object has a -``GuzzleHttp\Common\EventEmitter`` object that can be used to add event -*listeners* and event *subscribers* to all requests created by the client. - -.. important:: - - **Every** event listener or subscriber added to a client will be added to - every request created by the client. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Event\BeforeEvent; - - $client = new Client(); - - // Add a listener that will echo out requests before they are sent - $client->getEmitter()->on('before', function (BeforeEvent $e) { - echo 'About to send request: ' . $e->getRequest(); - }); - - $client->get('http://httpbin.org/get'); - // Outputs the request as a string because of the event - -See :doc:`events` for more information on the event system used in Guzzle. - -Environment Variables -===================== - -Guzzle exposes a few environment variables that can be used to customize the -behavior of the library. - -``GUZZLE_CURL_SELECT_TIMEOUT`` - Controls the duration in seconds that a curl_multi_* handler will use when - selecting on curl handles using ``curl_multi_select()``. Some systems - have issues with PHP's implementation of ``curl_multi_select()`` where - calling this function always results in waiting for the maximum duration of - the timeout. -``HTTP_PROXY`` - Defines the proxy to use when sending requests using the "http" protocol. -``HTTPS_PROXY`` - Defines the proxy to use when sending requests using the "https" protocol. - -Relevant ini Settings ---------------------- - -Guzzle can utilize PHP ini settings when configuring clients. - -``openssl.cafile`` - Specifies the path on disk to a CA file in PEM format to use when sending - requests over "https". See: https://wiki.php.net/rfc/tls-peer-verification#phpini_defaults diff --git a/vendor/guzzlehttp/guzzle/docs/conf.py b/vendor/guzzlehttp/guzzle/docs/conf.py deleted file mode 100644 index 917bdf4c..00000000 --- a/vendor/guzzlehttp/guzzle/docs/conf.py +++ /dev/null @@ -1,28 +0,0 @@ -import sys, os -from sphinx.highlighting import lexers -from pygments.lexers.web import PhpLexer - - -lexers['php'] = PhpLexer(startinline=True, linenos=1) -lexers['php-annotations'] = PhpLexer(startinline=True, linenos=1) -primary_domain = 'php' - -extensions = [] -templates_path = ['_templates'] -source_suffix = '.rst' -master_doc = 'index' -project = u'Guzzle' -copyright = u'2014, Michael Dowling' -version = '5.0.0' -html_title = "Guzzle Documentation" -html_short_title = "Guzzle" - -exclude_patterns = ['_build'] -html_static_path = ['_static'] - -on_rtd = os.environ.get('READTHEDOCS', None) == 'True' - -if not on_rtd: # only import and set the theme if we're building docs locally - import sphinx_rtd_theme - html_theme = 'sphinx_rtd_theme' - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] diff --git a/vendor/guzzlehttp/guzzle/docs/events.rst b/vendor/guzzlehttp/guzzle/docs/events.rst deleted file mode 100644 index 30afdb61..00000000 --- a/vendor/guzzlehttp/guzzle/docs/events.rst +++ /dev/null @@ -1,516 +0,0 @@ -============ -Event System -============ - -Guzzle uses an event emitter to allow you to easily extend the behavior of a -request, change the response associated with a request, and implement custom -error handling. All events in Guzzle are managed and emitted by an -**event emitter**. - -Event Emitters -============== - -Clients, requests, and any other class that implements the -``GuzzleHttp\Event\HasEmitterInterface`` interface have a -``GuzzleHttp\Event\Emitter`` object. You can add event *listeners* and -event *subscribers* to an event *emitter*. - -emitter - An object that implements ``GuzzleHttp\Event\EmitterInterface``. This - object emits named events to event listeners. You may register event - listeners on subscribers on an emitter. - -event listeners - Callable functions that are registered on an event emitter for specific - events. Event listeners are registered on an emitter with a *priority* - setting. If no priority is provided, ``0`` is used by default. - -event subscribers - Classes that tell an event emitter what methods to listen to and what - functions on the class to invoke when the event is triggered. Event - subscribers subscribe event listeners to an event emitter. They should be - used when creating more complex event based logic in applications (i.e., - cookie handling is implemented using an event subscriber because it's - easier to share a subscriber than an anonymous function and because - handling cookies is a complex process). - -priority - Describes the order in which event listeners are invoked when an event is - emitted. The higher a priority value, the earlier the event listener will - be invoked (a higher priority means the listener is more important). If - no priority is provided, the priority is assumed to be ``0``. - - When specifying an event priority, you can pass ``"first"`` or ``"last"`` to - dynamically specify the priority based on the current event priorities - associated with the given event name in the emitter. Use ``"first"`` to set - the priority to the current highest priority plus one. Use ``"last"`` to - set the priority to the current lowest event priority minus one. It is - important to remember that these dynamic priorities are calculated only at - the point of insertion into the emitter and they are not rearranged after - subsequent listeners are added to an emitter. - -propagation - Describes whether or not other event listeners are triggered. Event - emitters will trigger every event listener registered to a specific event - in priority order until all of the listeners have been triggered **or** - until the propagation of an event is stopped. - -Getting an EventEmitter ------------------------ - -You can get the event emitter of ``GuzzleHttp\Event\HasEmitterInterface`` -object using the the ``getEmitter()`` method. Here's an example of getting a -client object's event emitter. - -.. code-block:: php - - $client = new GuzzleHttp\Client(); - $emitter = $client->getEmitter(); - -.. note:: - - You'll notice that the event emitter used in Guzzle is very similar to the - `Symfony2 EventDispatcher component `_. - This is because the Guzzle event system is based on the Symfony2 event - system with several changes. Guzzle uses its own event emitter to improve - performance, isolate Guzzle from changes to the Symfony, and provide a few - improvements that make it easier to use for an HTTP client (e.g., the - addition of the ``once()`` method). - -Adding Event Listeners ----------------------- - -After you have the emitter, you can register event listeners that listen to -specific events using the ``on()`` method. When registering an event listener, -you must tell the emitter what event to listen to (e.g., "before", "after", -"progress", "complete", "error", etc.), what callable to invoke when the -event is triggered, and optionally provide a priority. - -.. code-block:: php - - use GuzzleHttp\Event\BeforeEvent; - - $emitter->on('before', function (BeforeEvent $event) { - echo $event->getRequest(); - }); - -When a listener is triggered, it is passed an event that implements the -``GuzzleHttp\Event\EventInterface`` interface, the name of the event, and the -event emitter itself. The above example could more verbosely be written as -follows: - -.. code-block:: php - - use GuzzleHttp\Event\BeforeEvent; - - $emitter->on('before', function (BeforeEvent $event, $name) { - echo $event->getRequest(); - }); - -You can add an event listener that automatically removes itself after it is -triggered using the ``once()`` method of an event emitter. - -.. code-block:: php - - $client = new GuzzleHttp\Client(); - $client->getEmitter()->once('before', function () { - echo 'This will only happen once... per request!'; - }); - -Event Propagation ------------------ - -Event listeners can prevent other event listeners from being triggered by -stopping an event's propagation. - -Stopping event propagation can be useful, for example, if an event listener has -changed the state of the subject to such an extent that allowing subsequent -event listeners to be triggered could place the subject in an inconsistent -state. This technique is used in Guzzle extensively when intercepting error -events with responses. - -You can stop the propagation of an event using the ``stopPropagation()`` method -of a ``GuzzleHttp\Event\EventInterface`` object: - -.. code-block:: php - - use GuzzleHttp\Event\ErrorEvent; - - $emitter->on('error', function (ErrorEvent $event) { - $event->stopPropagation(); - }); - -After stopping the propagation of an event, any subsequent event listeners that -have not yet been triggered will not be triggered. You can check to see if the -propagation of an event was stopped using the ``isPropagationStopped()`` method -of the event. - -.. code-block:: php - - $client = new GuzzleHttp\Client(); - $emitter = $client->getEmitter(); - // Note: assume that the $errorEvent was created - if ($emitter->emit('error', $errorEvent)->isPropagationStopped()) { - echo 'It was stopped!'; - } - -.. hint:: - - When emitting events, the event that was emitted is returned from the - emitter. This allows you to easily chain calls as shown in the above - example. - -Event Subscribers ------------------ - -Event subscribers are classes that implement the -``GuzzleHttp\Event\SubscriberInterface`` object. They are used to register -one or more event listeners to methods of the class. Event subscribers tell -event emitters exactly which events to listen to and what method to invoke on -the class when the event is triggered by called the ``getEvents()`` method of -a subscriber. - -The following example registers event listeners to the ``before`` and -``complete`` event of a request. When the ``before`` event is emitted, the -``onBefore`` instance method of the subscriber is invoked. When the -``complete`` event is emitted, the ``onComplete`` event of the subscriber is -invoked. Each array value in the ``getEvents()`` return value MUST -contain the name of the method to invoke and can optionally contain the -priority of the listener (as shown in the ``before`` listener in the example). - -.. code-block:: php - - use GuzzleHttp\Event\EmitterInterface; - use GuzzleHttp\Event\SubscriberInterface; - use GuzzleHttp\Event\BeforeEvent; - use GuzzleHttp\Event\CompleteEvent; - - class SimpleSubscriber implements SubscriberInterface - { - public function getEvents() - { - return [ - // Provide name and optional priority - 'before' => ['onBefore', 100], - 'complete' => ['onComplete'], - // You can pass a list of listeners with different priorities - 'error' => [['beforeError', 'first'], ['afterError', 'last']] - ]; - } - - public function onBefore(BeforeEvent $event, $name) - { - echo 'Before!'; - } - - public function onComplete(CompleteEvent $event, $name) - { - echo 'Complete!'; - } - } - -To register the listeners the subscriber needs to be attached to the emitter: - -.. code-block:: php - - $client = new GuzzleHttp\Client(); - $emitter = $client->getEmitter(); - $subscriber = new SimpleSubscriber(); - $emitter->attach($subscriber); - - //to remove the listeners - $emitter->detach($subscriber); - -.. note:: - - You can specify event priorities using integers or ``"first"`` and - ``"last"`` to dynamically determine the priority. - -Event Priorities -================ - -When adding event listeners or subscribers, you can provide an optional event -priority. This priority is used to determine how early or late a listener is -triggered. Specifying the correct priority is an important aspect of ensuring -a listener behaves as expected. For example, if you wanted to ensure that -cookies associated with a redirect were added to a cookie jar, you'd need to -make sure that the listener that collects the cookies is triggered before the -listener that performs the redirect. - -In order to help make the process of determining the correct event priority of -a listener easier, Guzzle provides several pre-determined named event -priorities. These priorities are exposed as constants on the -``GuzzleHttp\Event\RequestEvents`` object. - -last - Use ``"last"`` as an event priority to set the priority to the current - lowest event priority minus one. - -first - Use ``"first"`` as an event priority to set the priority to the current - highest priority plus one. - -``GuzzleHttp\Event\RequestEvents::EARLY`` - Used when you want a listener to be triggered as early as possible in the - event chain. - -``GuzzleHttp\Event\RequestEvents::LATE`` - Used when you want a listener to be to be triggered as late as possible in - the event chain. - -``GuzzleHttp\Event\RequestEvents::PREPARE_REQUEST`` - Used when you want a listener to be trigger while a request is being - prepared during the ``before`` event. This event priority is used by the - ``GuzzleHttp\Subscriber\Prepare`` event subscriber which is responsible for - guessing a Content-Type, Content-Length, and Expect header of a request. - You should subscribe after this event is triggered if you want to ensure - that this subscriber has already been triggered. - -``GuzzleHttp\Event\RequestEvents::SIGN_REQUEST`` - Used when you want a listener to be triggered when a request is about to be - signed. Any listener triggered at this point should expect that the request - object will no longer be mutated. If you are implementing a custom - signature subscriber, then you should use this event priority to sign - requests. - -``GuzzleHttp\Event\RequestEvents::VERIFY_RESPONSE`` - Used when you want a listener to be triggered when a response is being - validated during the ``complete`` event. The - ``GuzzleHttp\Subscriber\HttpError`` event subscriber uses this event - priority to check if an exception should be thrown due to a 4xx or 5xx - level response status code. If you are doing any kind of verification of a - response during the complete event, it should happen at this priority. - -``GuzzleHttp\Event\RequestEvents::REDIRECT_RESPONSE`` - Used when you want a listener to be triggered when a response is being - redirected during the ``complete`` event. The - ``GuzzleHttp\Subscriber\Redirect`` event subscriber uses this event - priority when performing redirects. - -You can use the above event priorities as a guideline for determining the -priority of you event listeners. You can use these constants and add to or -subtract from them to ensure that a listener happens before or after the named -priority. - -.. note:: - - "first" and "last" priorities are not adjusted after they added to an - emitter. For example, if you add a listener with a priority of "first", - you can still add subsequent listeners with a higher priority which would - be triggered before the listener added with a priority of "first". - -Working With Request Events -=========================== - -Requests emit lifecycle events when they are transferred. - -.. important:: - - Excluding the ``end`` event, request lifecycle events may be triggered - multiple times due to redirects, retries, or reusing a request multiple - times. Use the ``once()`` method want the event to be triggered once. You - can also remove an event listener from an emitter by using the emitter which - is provided to the listener. - -.. _before_event: - -before ------- - -The ``before`` event is emitted before a request is sent. The event emitted is -a ``GuzzleHttp\Event\BeforeEvent``. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Event\EmitterInterface; - use GuzzleHttp\Event\BeforeEvent; - - $client = new Client(['base_url' => 'http://httpbin.org']); - $request = $client->createRequest('GET', '/'); - $request->getEmitter()->on( - 'before', - function (BeforeEvent $e, $name) { - echo $name . "\n"; - // "before" - echo $e->getRequest()->getMethod() . "\n"; - // "GET" / "POST" / "PUT" / etc. - echo get_class($e->getClient()); - // "GuzzleHttp\Client" - } - ); - -You can intercept a request with a response before the request is sent over the -wire. The ``intercept()`` method of the ``BeforeEvent`` accepts a -``GuzzleHttp\Message\ResponseInterface``. Intercepting the event will prevent -the request from being sent over the wire and stops the propagation of the -``before`` event, preventing subsequent event listeners from being invoked. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Event\BeforeEvent; - use GuzzleHttp\Message\Response; - - $client = new Client(['base_url' => 'http://httpbin.org']); - $request = $client->createRequest('GET', '/status/500'); - $request->getEmitter()->on('before', function (BeforeEvent $e) { - $response = new Response(200); - $e->intercept($response); - }); - - $response = $client->send($request); - echo $response->getStatusCode(); - // 200 - -.. attention:: - - Any exception encountered while executing the ``before`` event will trigger - the ``error`` event of a request. - -.. _complete_event: - -complete --------- - -The ``complete`` event is emitted after a transaction completes and an entire -response has been received. The event is a ``GuzzleHttp\Event\CompleteEvent``. - -You can intercept the ``complete`` event with a different response if needed -using the ``intercept()`` method of the event. This can be useful, for example, -for changing the response for caching. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Event\CompleteEvent; - use GuzzleHttp\Message\Response; - - $client = new Client(['base_url' => 'http://httpbin.org']); - $request = $client->createRequest('GET', '/status/302'); - $cachedResponse = new Response(200); - - $request->getEmitter()->on( - 'complete', - function (CompleteEvent $e) use ($cachedResponse) { - if ($e->getResponse()->getStatusCode() == 302) { - // Intercept the original transaction with the new response - $e->intercept($cachedResponse); - } - } - ); - - $response = $client->send($request); - echo $response->getStatusCode(); - // 200 - -.. attention:: - - Any ``GuzzleHttp\Exception\RequestException`` encountered while executing - the ``complete`` event will trigger the ``error`` event of a request. - -.. _error_event: - -error ------ - -The ``error`` event is emitted when a request fails (whether it's from a -networking error or an HTTP protocol error). The event emitted is a -``GuzzleHttp\Event\ErrorEvent``. - -This event is useful for retrying failed requests. Here's an example of -retrying failed basic auth requests by re-sending the original request with -a username and password. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Event\ErrorEvent; - - $client = new Client(['base_url' => 'http://httpbin.org']); - $request = $client->createRequest('GET', '/basic-auth/foo/bar'); - $request->getEmitter()->on('error', function (ErrorEvent $e) { - if ($e->getResponse()->getStatusCode() == 401) { - // Add authentication stuff as needed and retry the request - $e->getRequest()->setHeader('Authorization', 'Basic ' . base64_encode('foo:bar')); - // Get the client of the event and retry the request - $newResponse = $e->getClient()->send($e->getRequest()); - // Intercept the original transaction with the new response - $e->intercept($newResponse); - } - }); - -.. attention:: - - If an ``error`` event is intercepted with a response, then the ``complete`` - event of a request is triggered. If the ``complete`` event fails, then the - ``error`` event is triggered once again. - -.. _progress_event: - -progress --------- - -The ``progress`` event is emitted when data is uploaded or downloaded. The -event emitted is a ``GuzzleHttp\Event\ProgressEvent``. - -You can access the emitted progress values using the corresponding public -properties of the event object: - -- ``$downloadSize``: The number of bytes that will be downloaded (if known) -- ``$downloaded``: The number of bytes that have been downloaded -- ``$uploadSize``: The number of bytes that will be uploaded (if known) -- ``$uploaded``: The number of bytes that have been uploaded - -This event cannot be intercepted. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Event\ProgressEvent; - - $client = new Client(['base_url' => 'http://httpbin.org']); - $request = $client->createRequest('PUT', '/put', [ - 'body' => str_repeat('.', 100000) - ]); - - $request->getEmitter()->on('progress', function (ProgressEvent $e) { - echo 'Downloaded ' . $e->downloaded . ' of ' . $e->downloadSize . ' ' - . 'Uploaded ' . $e->uploaded . ' of ' . $e->uploadSize . "\r"; - }); - - $client->send($request); - echo "\n"; - -.. _end_event: - -end ---- - -The ``end`` event is a terminal event, emitted once per request, that provides -access to the response that was received or the exception that was encountered. -The event emitted is a ``GuzzleHttp\Event\EndEvent``. - -This event can be intercepted, but keep in mind that the ``complete`` event -will not fire after intercepting this event. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Event\EndEvent; - - $client = new Client(['base_url' => 'http://httpbin.org']); - $request = $client->createRequest('PUT', '/put', [ - 'body' => str_repeat('.', 100000) - ]); - - $request->getEmitter()->on('end', function (EndEvent $e) { - if ($e->getException()) { - echo 'Error: ' . $e->getException()->getMessage(); - } else { - echo 'Response: ' . $e->getResponse(); - } - }); - - $client->send($request); - echo "\n"; diff --git a/vendor/guzzlehttp/guzzle/docs/faq.rst b/vendor/guzzlehttp/guzzle/docs/faq.rst deleted file mode 100644 index a8e9ad06..00000000 --- a/vendor/guzzlehttp/guzzle/docs/faq.rst +++ /dev/null @@ -1,199 +0,0 @@ -=== -FAQ -=== - -Why should I use Guzzle? -======================== - -Guzzle makes it easy to send HTTP requests and super simple to integrate with -web services. Guzzle manages things like persistent connections, represents -query strings as collections, makes it simple to send streaming POST requests -with fields and files, and abstracts away the underlying HTTP transport layer. -By providing an object oriented interface for HTTP clients, requests, responses, -headers, and message bodies, Guzzle makes it so that you no longer need to fool -around with cURL options, stream contexts, or sockets. - -**Asynchronous and Synchronous Requests** - -Guzzle allows you to send both asynchronous and synchronous requests using the -same interface and no direct dependency on an event loop. This flexibility -allows Guzzle to send an HTTP request using the most appropriate HTTP handler -based on the request being sent. For example, when sending synchronous -requests, Guzzle will by default send requests using cURL easy handles to -ensure you're using the fastest possible method for serially transferring HTTP -requests. When sending asynchronous requests, Guzzle might use cURL's multi -interface or any other asynchronous handler you configure. When you request -streaming data, Guzzle will by default use PHP's stream wrapper. - -**Streams** - -Request and response message bodies use :doc:`Guzzle Streams `, -allowing you to stream data without needing to load it all into memory. -Guzzle's stream layer provides a large suite of functionality: - -- You can modify streams at runtime using custom or a number of - pre-made decorators. -- You can emit progress events as data is read from a stream. -- You can validate the integrity of a stream using a rolling hash as data is - read from a stream. - -**Event System and Plugins** - -Guzzle's event system allows you to completely modify the behavior of a client -or request at runtime to cater them for any API. You can send a request with a -client, and the client can do things like automatically retry your request if -it fails, automatically redirect, log HTTP messages that are sent over the -wire, emit progress events as data is uploaded and downloaded, sign requests -using OAuth 1.0, verify the integrity of messages before and after they are -sent over the wire, and anything else you might need. - -**Testable** - -Another important aspect of Guzzle is that it's really -:doc:`easy to test clients `. You can mock HTTP responses and when -testing an handler implementation, Guzzle provides a mock node.js web server. - -**Ecosystem** - -Guzzle has a large `ecosystem of plugins `_, -including `service descriptions `_ -which allows you to abstract web services using service descriptions. These -service descriptions define how to serialize an HTTP request and how to parse -an HTTP response into a more meaningful model object. - -- `Guzzle Command `_: Provides the building - blocks for service description abstraction. -- `Guzzle Services `_: Provides an - implementation of "Guzzle Command" that utilizes Guzzle's service description - format. - -Does Guzzle require cURL? -========================= - -No. Guzzle can use any HTTP handler to send requests. This means that Guzzle -can be used with cURL, PHP's stream wrapper, sockets, and non-blocking libraries -like `React `_. You just need to configure a -`RingPHP `_ handler to use a -different method of sending requests. - -.. note:: - - Guzzle has historically only utilized cURL to send HTTP requests. cURL is - an amazing HTTP client (arguably the best), and Guzzle will continue to use - it by default when it is available. It is rare, but some developers don't - have cURL installed on their systems or run into version specific issues. - By allowing swappable HTTP handlers, Guzzle is now much more customizable - and able to adapt to fit the needs of more developers. - -Can Guzzle send asynchronous requests? -====================================== - -Yes. Pass the ``future`` true request option to a request to send it -asynchronously. Guzzle will then return a ``GuzzleHttp\Message\FutureResponse`` -object that can be used synchronously by accessing the response object like a -normal response, and it can be used asynchronously using a promise that is -notified when the response is resolved with a real response or rejected with an -exception. - -.. code-block:: php - - $request = $client->createRequest('GET', ['future' => true]); - $client->send($request)->then(function ($response) { - echo 'Got a response! ' . $response; - }); - -You can force an asynchronous response to complete using the ``wait()`` method -of a response. - -.. code-block:: php - - $request = $client->createRequest('GET', ['future' => true]); - $futureResponse = $client->send($request); - $futureResponse->wait(); - -How can I add custom cURL options? -================================== - -cURL offer a huge number of `customizable options `_. -While Guzzle normalizes many of these options across different handlers, there -are times when you need to set custom cURL options. This can be accomplished -by passing an associative array of cURL settings in the **curl** key of the -**config** request option. - -For example, let's say you need to customize the outgoing network interface -used with a client. - -.. code-block:: php - - $client->get('/', [ - 'config' => [ - 'curl' => [ - CURLOPT_INTERFACE => 'xxx.xxx.xxx.xxx' - ] - ] - ]); - -How can I add custom stream context options? -============================================ - -You can pass custom `stream context options `_ -using the **stream_context** key of the **config** request option. The -**stream_context** array is an associative array where each key is a PHP -transport, and each value is an associative array of transport options. - -For example, let's say you need to customize the outgoing network interface -used with a client and allow self-signed certificates. - -.. code-block:: php - - $client->get('/', [ - 'stream' => true, - 'config' => [ - 'stream_context' => [ - 'ssl' => [ - 'allow_self_signed' => true - ], - 'socket' => [ - 'bindto' => 'xxx.xxx.xxx.xxx' - ] - ] - ] - ]); - -Why am I getting an SSL verification error? -=========================================== - -You need to specify the path on disk to the CA bundle used by Guzzle for -verifying the peer certificate. See :ref:`verify-option`. - -What is this Maximum function nesting error? -============================================ - - Maximum function nesting level of '100' reached, aborting - -You could run into this error if you have the XDebug extension installed and -you execute a lot of requests in callbacks. This error message comes -specifically from the XDebug extension. PHP itself does not have a function -nesting limit. Change this setting in your php.ini to increase the limit:: - - xdebug.max_nesting_level = 1000 - -Why am I getting a 417 error response? -====================================== - -This can occur for a number of reasons, but if you are sending PUT, POST, or -PATCH requests with an ``Expect: 100-Continue`` header, a server that does not -support this header will return a 417 response. You can work around this by -setting the ``expect`` request option to ``false``: - -.. code-block:: php - - $client = new GuzzleHttp\Client(); - - // Disable the expect header on a single request - $response = $client->put('/', [], 'the body', [ - 'expect' => false - ]); - - // Disable the expect header on all client requests - $client->setDefaultOption('expect', false) diff --git a/vendor/guzzlehttp/guzzle/docs/handlers.rst b/vendor/guzzlehttp/guzzle/docs/handlers.rst deleted file mode 100644 index d452003f..00000000 --- a/vendor/guzzlehttp/guzzle/docs/handlers.rst +++ /dev/null @@ -1,43 +0,0 @@ -================ -RingPHP Handlers -================ - -Guzzle uses RingPHP handlers to send HTTP requests over the wire. -RingPHP provides a low-level library that can be used to "glue" Guzzle with -any transport method you choose. By default, Guzzle utilizes cURL and PHP's -stream wrappers to send HTTP requests. - -RingPHP handlers makes it extremely simple to integrate Guzzle with any -HTTP transport. For example, you could quite easily bridge Guzzle and React -to use Guzzle in React's event loop. - -Using a handler ---------------- - -You can change the handler used by a client using the ``handler`` option in the -``GuzzleHttp\Client`` constructor. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Ring\Client\MockHandler; - - // Create a mock handler that always returns a 200 response. - $handler = new MockHandler(['status' => 200]); - - // Configure to client to use the mock handler. - $client = new Client(['handler' => $handler]); - -At its core, handlers are simply PHP callables that accept a request array -and return a ``GuzzleHttp\Ring\Future\FutureArrayInterface``. This future array -can be used just like a normal PHP array, causing it to block, or you can use -the promise interface using the ``then()`` method of the future. Guzzle hooks -up to the RingPHP project using a very simple bridge class -(``GuzzleHttp\RingBridge``). - -Creating a handler ------------------- - -See the `RingPHP `_ project -documentation for more information on creating custom handlers that can be -used with Guzzle clients. diff --git a/vendor/guzzlehttp/guzzle/docs/http-messages.rst b/vendor/guzzlehttp/guzzle/docs/http-messages.rst deleted file mode 100644 index 0c6527a8..00000000 --- a/vendor/guzzlehttp/guzzle/docs/http-messages.rst +++ /dev/null @@ -1,483 +0,0 @@ -============================= -Request and Response Messages -============================= - -Guzzle is an HTTP client that sends HTTP requests to a server and receives HTTP -responses. Both requests and responses are referred to as messages. - -Headers -======= - -Both request and response messages contain HTTP headers. - -Complex Headers ---------------- - -Some headers contain additional key value pair information. For example, Link -headers contain a link and several key value pairs: - -:: - - ; rel="thing"; type="image/jpeg" - -Guzzle provides a convenience feature that can be used to parse these types of -headers: - -.. code-block:: php - - use GuzzleHttp\Message\Request; - - $request = new Request('GET', '/', [ - 'Link' => '; rel="front"; type="image/jpeg"' - ]); - - $parsed = Request::parseHeader($request, 'Link'); - var_export($parsed); - -Will output: - -.. code-block:: php - - array ( - 0 => - array ( - 0 => '', - 'rel' => 'front', - 'type' => 'image/jpeg', - ), - ) - -The result contains a hash of key value pairs. Header values that have no key -(i.e., the link) are indexed numerically while headers parts that form a key -value pair are added as a key value pair. - -See :ref:`headers` for information on how the headers of a request and response -can be accessed and modified. - -Body -==== - -Both request and response messages can contain a body. - -You can check to see if a request or response has a body using the -``getBody()`` method: - -.. code-block:: php - - $response = GuzzleHttp\get('http://httpbin.org/get'); - if ($response->getBody()) { - echo $response->getBody(); - // JSON string: { ... } - } - -The body used in request and response objects is a -``GuzzleHttp\Stream\StreamInterface``. This stream is used for both uploading -data and downloading data. Guzzle will, by default, store the body of a message -in a stream that uses PHP temp streams. When the size of the body exceeds -2 MB, the stream will automatically switch to storing data on disk rather than -in memory (protecting your application from memory exhaustion). - -You can change the body used in a request or response using the ``setBody()`` -method: - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - $request = $client->createRequest('PUT', 'http://httpbin.org/put'); - $request->setBody(Stream::factory('foo')); - -The easiest way to create a body for a request is using the static -``GuzzleHttp\Stream\Stream::factory()`` method. This method accepts various -inputs like strings, resources returned from ``fopen()``, and other -``GuzzleHttp\Stream\StreamInterface`` objects. - -The body of a request or response can be cast to a string or you can read and -write bytes off of the stream as needed. - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - $request = $client->createRequest('PUT', 'http://httpbin.org/put', ['body' => 'testing...']); - - echo $request->getBody()->read(4); - // test - echo $request->getBody()->read(4); - // ing. - echo $request->getBody()->read(1024); - // .. - var_export($request->eof()); - // true - -You can find out more about Guzzle stream objects in :doc:`streams`. - -Requests -======== - -Requests are sent from a client to a server. Requests include the method to -be applied to a resource, the identifier of the resource, and the protocol -version to use. - -Clients are used to create request messages. More precisely, clients use -a ``GuzzleHttp\Message\MessageFactoryInterface`` to create request messages. -You create requests with a client using the ``createRequest()`` method. - -.. code-block:: php - - // Create a request but don't send it immediately - $request = $client->createRequest('GET', 'http://httpbin.org/get'); - -Request Methods ---------------- - -When creating a request, you are expected to provide the HTTP method you wish -to perform. You can specify any method you'd like, including a custom method -that might not be part of RFC 7231 (like "MOVE"). - -.. code-block:: php - - // Create a request using a completely custom HTTP method - $request = $client->createRequest('MOVE', 'http://httpbin.org/move', ['exceptions' => false]); - - echo $request->getMethod(); - // MOVE - - $response = $client->send($request); - echo $response->getStatusCode(); - // 405 - -You can create and send a request using methods on a client that map to the -HTTP method you wish to use. - -:GET: ``$client->get('http://httpbin.org/get', [/** options **/])`` -:POST: ``$client->post('http://httpbin.org/post', [/** options **/])`` -:HEAD: ``$client->head('http://httpbin.org/get', [/** options **/])`` -:PUT: ``$client->put('http://httpbin.org/put', [/** options **/])`` -:DELETE: ``$client->delete('http://httpbin.org/delete', [/** options **/])`` -:OPTIONS: ``$client->options('http://httpbin.org/get', [/** options **/])`` -:PATCH: ``$client->patch('http://httpbin.org/put', [/** options **/])`` - -.. code-block:: php - - $response = $client->patch('http://httpbin.org/patch', ['body' => 'content']); - -Request URI ------------ - -The resource you are requesting with an HTTP request is identified by the -path of the request, the query string, and the "Host" header of the request. - -When creating a request, you can provide the entire resource URI as a URL. - -.. code-block:: php - - $response = $client->get('http://httbin.org/get?q=foo'); - -Using the above code, you will send a request that uses ``httpbin.org`` as -the Host header, sends the request over port 80, uses ``/get`` as the path, -and sends ``?q=foo`` as the query string. All of this is parsed automatically -from the provided URI. - -Sometimes you don't know what the entire request will be when it is created. -In these cases, you can modify the request as needed before sending it using -the ``createRequest()`` method of the client and methods on the request that -allow you to change it. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httbin.org'); - -You can change the path of the request using ``setPath()``: - -.. code-block:: php - - $request->setPath('/get'); - echo $request->getPath(); - // /get - echo $request->getUrl(); - // http://httpbin.com/get - -Scheme -~~~~~~ - -The `scheme `_ of a request -specifies the protocol to use when sending the request. When using Guzzle, the -scheme can be set to "http" or "https". - -You can change the scheme of the request using the ``setScheme()`` method: - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httbin.org'); - $request->setScheme('https'); - echo $request->getScheme(); - // https - echo $request->getUrl(); - // https://httpbin.com/get - -Port -~~~~ - -No port is necessary when using the "http" or "https" schemes, but you can -override the port using ``setPort()``. If you need to modify the port used with -the specified scheme from the default setting, then you must use the -``setPort()`` method. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httbin.org'); - $request->setPort(8080); - echo $request->getPort(); - // 8080 - echo $request->getUrl(); - // https://httpbin.com:8080/get - - // Set the port back to the default value for the scheme - $request->setPort(443); - echo $request->getUrl(); - // https://httpbin.com/get - -Query string -~~~~~~~~~~~~ - -You can get the query string of the request using the ``getQuery()`` method. -This method returns a ``GuzzleHttp\Query`` object. A Query object can be -accessed like a PHP array, iterated in a foreach statement like a PHP array, -and cast to a string. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httbin.org'); - $query = $request->getQuery(); - $query['foo'] = 'bar'; - $query['baz'] = 'bam'; - $query['bam'] = ['test' => 'abc']; - - echo $request->getQuery(); - // foo=bar&baz=bam&bam%5Btest%5D=abc - - echo $request->getQuery()['foo']; - // bar - echo $request->getQuery()->get('foo'); - // bar - echo $request->getQuery()->get('foo'); - // bar - - var_export($request->getQuery()['bam']); - // array('test' => 'abc') - - foreach ($query as $key => $value) { - var_export($value); - } - - echo $request->getUrl(); - // https://httpbin.com/get?foo=bar&baz=bam&bam%5Btest%5D=abc - -Query Aggregators -^^^^^^^^^^^^^^^^^ - -Query objects can store scalar values or arrays of values. When an array of -values is added to a query object, the query object uses a query aggregator to -convert the complex structure into a string. Query objects will use -`PHP style query strings `_ when complex -query string parameters are converted to a string. You can customize how -complex query string parameters are aggregated using the ``setAggregator()`` -method of a query string object. - -.. code-block:: php - - $query->setAggregator($query::duplicateAggregator()); - -In the above example, we've changed the query object to use the -"duplicateAggregator". This aggregator will allow duplicate entries to appear -in a query string rather than appending "[n]" to each value. So if you had a -query string with ``['a' => ['b', 'c']]``, the duplicate aggregator would -convert this to "a=b&a=c" while the default aggregator would convert this to -"a[0]=b&a[1]=c" (with urlencoded brackets). - -The ``setAggregator()`` method accepts a ``callable`` which is used to convert -a deeply nested array of query string variables into a flattened array of key -value pairs. The callable accepts an array of query data and returns a -flattened array of key value pairs where each value is an array of strings. -You can use the ``GuzzleHttp\Query::walkQuery()`` static function to easily -create custom query aggregators. - -Host -~~~~ - -You can change the host header of the request in a predictable way using the -``setHost()`` method of a request: - -.. code-block:: php - - $request->setHost('www.google.com'); - echo $request->getHost(); - // www.google.com - echo $request->getUrl(); - // https://www.google.com/get?foo=bar&baz=bam - -.. note:: - - The Host header can also be changed by modifying the Host header of a - request directly, but modifying the Host header directly could result in - sending a request to a different Host than what is specified in the Host - header (sometimes this is actually the desired behavior). - -Resource -~~~~~~~~ - -You can use the ``getResource()`` method of a request to return the path and -query string of a request in a single string. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httpbin.org/get?baz=bar'); - echo $request->getResource(); - // /get?baz=bar - -Request Config --------------- - -Request messages contain a configuration collection that can be used by -event listeners and HTTP handlers to modify how a request behaves or is -transferred over the wire. For example, many of the request options that are -specified when creating a request are actually set as config options that are -only acted upon by handlers and listeners when the request is sent. - -You can get access to the request's config object using the ``getConfig()`` -method of a request. - -.. code-block:: php - - $request = $client->createRequest('GET', '/'); - $config = $request->getConfig(); - -The config object is a ``GuzzleHttp\Collection`` object that acts like -an associative array. You can grab values from the collection using array like -access. You can also modify and remove values using array like access. - -.. code-block:: php - - $config['foo'] = 'bar'; - echo $config['foo']; - // bar - - var_export(isset($config['foo'])); - // true - - unset($config['foo']); - var_export(isset($config['foo'])); - // false - - var_export($config['foo']); - // NULL - -HTTP handlers and event listeners can expose additional customization options -through request config settings. For example, in order to specify custom cURL -options to the cURL handler, you need to specify an associative array in the -``curl`` ``config`` request option. - -.. code-block:: php - - $client->get('/', [ - 'config' => [ - 'curl' => [ - CURLOPT_HTTPAUTH => CURLAUTH_NTLM, - CURLOPT_USERPWD => 'username:password' - ] - ] - ]); - -Consult the HTTP handlers and event listeners you are using to see if they -allow customization through request configuration options. - -Event Emitter -------------- - -Request objects implement ``GuzzleHttp\Event\HasEmitterInterface``, so they -have a method called ``getEmitter()`` that can be used to get an event emitter -used by the request. Any listener or subscriber attached to a request will only -be triggered for the lifecycle events of a specific request. Conversely, adding -an event listener or subscriber to a client will listen to all lifecycle events -of all requests created by the client. - -See :doc:`events` for more information. - -Responses -========= - -Responses are the HTTP messages a client receives from a server after sending -an HTTP request message. - -Start-Line ----------- - -The start-line of a response contains the protocol and protocol version, -status code, and reason phrase. - -.. code-block:: php - - $response = GuzzleHttp\get('http://httpbin.org/get'); - echo $response->getStatusCode(); - // 200 - echo $response->getReasonPhrase(); - // OK - echo $response->getProtocolVersion(); - // 1.1 - -Body ----- - -As described earlier, you can get the body of a response using the -``getBody()`` method. - -.. code-block:: php - - if ($body = $response->getBody()) { - echo $body; - // Cast to a string: { ... } - $body->seek(0); - // Rewind the body - $body->read(1024); - // Read bytes of the body - } - -When working with JSON responses, you can use the ``json()`` method of a -response: - -.. code-block:: php - - $json = $response->json(); - -.. note:: - - Guzzle uses the ``json_decode()`` method of PHP and uses arrays rather than - ``stdClass`` objects for objects. - -You can use the ``xml()`` method when working with XML data. - -.. code-block:: php - - $xml = $response->xml(); - -.. note:: - - Guzzle uses the ``SimpleXMLElement`` objects when converting response - bodies to XML. - -Effective URL -------------- - -The URL that was ultimately accessed that returned a response can be accessed -using the ``getEffectiveUrl()`` method of a response. This method will return -the URL of a request or the URL of the last redirected URL if any redirects -occurred while transferring a request. - -.. code-block:: php - - $response = GuzzleHttp\get('http://httpbin.org/get'); - echo $response->getEffectiveUrl(); - // http://httpbin.org/get - - $response = GuzzleHttp\get('http://httpbin.org/redirect-to?url=http://www.google.com'); - echo $response->getEffectiveUrl(); - // http://www.google.com diff --git a/vendor/guzzlehttp/guzzle/docs/index.rst b/vendor/guzzlehttp/guzzle/docs/index.rst deleted file mode 100644 index d456a5f0..00000000 --- a/vendor/guzzlehttp/guzzle/docs/index.rst +++ /dev/null @@ -1,98 +0,0 @@ -.. title:: Guzzle | PHP HTTP client and framework for consuming RESTful web services - -====== -Guzzle -====== - -Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and -trivial to integrate with web services. - -- Manages things like persistent connections, represents query strings as - collections, simplifies sending streaming POST requests with fields and - files, and abstracts away the underlying HTTP transport layer. -- Can send both synchronous and asynchronous requests using the same interface - without requiring a dependency on a specific event loop. -- Pluggable HTTP handlers allows Guzzle to integrate with any method you choose - for sending HTTP requests over the wire (e.g., cURL, sockets, PHP's stream - wrapper, non-blocking event loops like `React `_, etc.). -- Guzzle makes it so that you no longer need to fool around with cURL options, - stream contexts, or sockets. - -.. code-block:: php - - $client = new GuzzleHttp\Client(); - $response = $client->get('http://guzzlephp.org'); - $res = $client->get('https://api.github.com/user', ['auth' => ['user', 'pass']]); - echo $res->getStatusCode(); - // "200" - echo $res->getHeader('content-type'); - // 'application/json; charset=utf8' - echo $res->getBody(); - // {"type":"User"...' - var_export($res->json()); - // Outputs the JSON decoded data - - // Send an asynchronous request. - $req = $client->createRequest('GET', 'http://httpbin.org', ['future' => true]); - $client->send($req)->then(function ($response) { - echo 'I completed! ' . $response; - }); - -User guide ----------- - -.. toctree:: - :maxdepth: 2 - - overview - quickstart - clients - http-messages - events - streams - handlers - testing - faq - -HTTP Components ---------------- - -There are a number of optional libraries you can use along with Guzzle's HTTP -layer to add capabilities to the client. - -`Log Subscriber `_ - Logs HTTP requests and responses sent over the wire using customizable - log message templates. - -`OAuth Subscriber `_ - Signs requests using OAuth 1.0. - -`Cache Subscriber `_ - Implements a private transparent proxy cache that caches HTTP responses. - -`Retry Subscriber `_ - Retries failed requests using customizable retry strategies (e.g., retry - based on response status code, cURL error codes, etc.) - -`Message Integrity Subscriber `_ - Verifies the message integrity of HTTP responses using customizable - validators. This plugin can be used, for example, to verify the Content-MD5 - headers of responses. - -Service Description Commands ----------------------------- - -You can use the **Guzzle Command** library to encapsulate interaction with a -web service using command objects. Building on top of Guzzle's command -abstraction allows you to easily implement things like service description that -can be used to serialize requests and parse responses using a meta-description -of a web service. - -`Guzzle Command `_ - Provides the foundational elements used to build high-level, command based, - web service clients with Guzzle. - -`Guzzle Services `_ - Provides an implementation of the *Guzzle Command* library that uses - Guzzle service descriptions to describe web services, serialize requests, - and parse responses into easy to use model structures. diff --git a/vendor/guzzlehttp/guzzle/docs/overview.rst b/vendor/guzzlehttp/guzzle/docs/overview.rst deleted file mode 100644 index 1355afa1..00000000 --- a/vendor/guzzlehttp/guzzle/docs/overview.rst +++ /dev/null @@ -1,150 +0,0 @@ -======== -Overview -======== - -Requirements -============ - -#. PHP 5.4.0 -#. To use the PHP stream handler, ``allow_url_fopen`` must be enabled in your - system's php.ini. -#. To use the cURL handler, you must have a recent version of cURL >= 7.16.2 - compiled with OpenSSL and zlib. - -.. note:: - - Guzzle no longer requires cURL in order to send HTTP requests. Guzzle will - use the PHP stream wrapper to send HTTP requests if cURL is not installed. - Alternatively, you can provide your own HTTP handler used to send requests. - -.. _installation: - -Installation -============ - -The recommended way to install Guzzle is with `Composer `_. Composer is a dependency -management tool for PHP that allows you to declare the dependencies your project needs and installs them into your -project. - -.. code-block:: bash - - # Install Composer - curl -sS https://getcomposer.org/installer | php - -You can add Guzzle as a dependency using the composer.phar CLI: - -.. code-block:: bash - - php composer.phar require guzzlehttp/guzzle:~5.0 - -Alternatively, you can specify Guzzle as a dependency in your project's -existing composer.json file: - -.. code-block:: js - - { - "require": { - "guzzlehttp/guzzle": "~5.0" - } - } - -After installing, you need to require Composer's autoloader: - -.. code-block:: php - - require 'vendor/autoload.php'; - -You can find out more on how to install Composer, configure autoloading, and -other best-practices for defining dependencies at `getcomposer.org `_. - -Bleeding edge -------------- - -During your development, you can keep up with the latest changes on the master -branch by setting the version requirement for Guzzle to ``~5.0@dev``. - -.. code-block:: js - - { - "require": { - "guzzlehttp/guzzle": "~5.0@dev" - } - } - -License -======= - -Licensed using the `MIT license `_. - - Copyright (c) 2014 Michael Dowling - - 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. - -Contributing -============ - -Guidelines ----------- - -1. Guzzle follows PSR-0, PSR-1, and PSR-2. -2. Guzzle is meant to be lean and fast with very few dependencies. -3. Guzzle has a minimum PHP version requirement of PHP 5.4. Pull requests must - not require a PHP version greater than PHP 5.4. -4. All pull requests must include unit tests to ensure the change works as - expected and to prevent regressions. - -Running the tests ------------------ - -In order to contribute, you'll need to checkout the source from GitHub and -install Guzzle's dependencies using Composer: - -.. code-block:: bash - - git clone https://github.com/guzzle/guzzle.git - cd guzzle && curl -s http://getcomposer.org/installer | php && ./composer.phar install --dev - -Guzzle is unit tested with PHPUnit. Run the tests using the vendored PHPUnit -binary: - -.. code-block:: bash - - vendor/bin/phpunit - -.. note:: - - You'll need to install node.js v0.5.0 or newer in order to perform - integration tests on Guzzle's HTTP handlers. - -Reporting a security vulnerability -================================== - -We want to ensure that Guzzle is a secure HTTP client library for everyone. If -you've discovered a security vulnerability in Guzzle, we appreciate your help -in disclosing it to us in a `responsible manner `_. - -Publicly disclosing a vulnerability can put the entire community at risk. If -you've discovered a security concern, please email us at -security@guzzlephp.org. We'll work with you to make sure that we understand the -scope of the issue, and that we fully address your concern. We consider -correspondence sent to security@guzzlephp.org our highest priority, and work to -address any issues that arise as quickly as possible. - -After a security vulnerability has been corrected, a security hotfix release will -be deployed as soon as possible. diff --git a/vendor/guzzlehttp/guzzle/docs/quickstart.rst b/vendor/guzzlehttp/guzzle/docs/quickstart.rst deleted file mode 100644 index 65a70ed2..00000000 --- a/vendor/guzzlehttp/guzzle/docs/quickstart.rst +++ /dev/null @@ -1,448 +0,0 @@ -========== -Quickstart -========== - -This page provides a quick introduction to Guzzle and introductory examples. -If you have not already installed, Guzzle, head over to the :ref:`installation` -page. - -Make a Request -============== - -You can send requests with Guzzle using a ``GuzzleHttp\ClientInterface`` -object. - -Creating a Client ------------------ - -The procedural API is simple but not very testable; it's best left for quick -prototyping. If you want to use Guzzle in a more flexible and testable way, -then you'll need to use a ``GuzzleHttp\ClientInterface`` object. - -.. code-block:: php - - use GuzzleHttp\Client; - - $client = new Client(); - $response = $client->get('http://httpbin.org/get'); - - // You can use the same methods you saw in the procedural API - $response = $client->delete('http://httpbin.org/delete'); - $response = $client->head('http://httpbin.org/get'); - $response = $client->options('http://httpbin.org/get'); - $response = $client->patch('http://httpbin.org/patch'); - $response = $client->post('http://httpbin.org/post'); - $response = $client->put('http://httpbin.org/put'); - -You can create a request with a client and then send the request with the -client when you're ready. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://www.foo.com'); - $response = $client->send($request); - -Client objects provide a great deal of flexibility in how request are -transferred including default request options, subscribers that are attached -to each request, and a base URL that allows you to send requests with relative -URLs. You can find out all about clients in the :doc:`clients` page of the -documentation. - -Using Responses -=============== - -In the previous examples, we retrieved a ``$response`` variable. This value is -actually a ``GuzzleHttp\Message\ResponseInterface`` object and contains lots -of helpful information. - -You can get the status code and reason phrase of the response. - -.. code-block:: php - - $code = $response->getStatusCode(); - // 200 - - $reason = $response->getReasonPhrase(); - // OK - -By providing the ``future`` request option to a request, you can send requests -asynchronously using the promise interface of a future response. - -.. code-block:: php - - $client->get('http://httpbin.org', ['future' => true]) - ->then(function ($response) { - echo $response->getStatusCode(); - }); - -Response Body -------------- - -The body of a response can be retrieved and cast to a string. - -.. code-block:: php - - $body = $response->getBody(); - echo $body; - // { "some_json_data" ...} - -You can also read read bytes from body of a response like a stream. - -.. code-block:: php - - $body = $response->getBody(); - - while (!$body->eof()) { - echo $body->read(1024); - } - -JSON Responses -~~~~~~~~~~~~~~ - -You can more easily work with JSON responses using the ``json()`` method of a -response. - -.. code-block:: php - - $response = $client->get('http://httpbin.org/get'); - $json = $response->json(); - var_dump($json[0]['origin']); - -Guzzle internally uses PHP's ``json_decode()`` function to parse responses. If -Guzzle is unable to parse the JSON response body, then a -``GuzzleHttp\Exception\ParseException`` is thrown. - -XML Responses -~~~~~~~~~~~~~ - -You can use a response's ``xml()`` method to more easily work with responses -that contain XML data. - -.. code-block:: php - - $response = $client->get('https://github.com/mtdowling.atom'); - $xml = $response->xml(); - echo $xml->id; - // tag:github.com,2008:/mtdowling - -Guzzle internally uses a ``SimpleXMLElement`` object to parse responses. If -Guzzle is unable to parse the XML response body, then a -``GuzzleHttp\Exception\ParseException`` is thrown. - -Query String Parameters -======================= - -Sending query string parameters with a request is easy. You can set query -string parameters in the request's URL. - -.. code-block:: php - - $response = $client->get('http://httpbin.org?foo=bar'); - -You can also specify the query string parameters using the ``query`` request -option. - -.. code-block:: php - - $client->get('http://httpbin.org', [ - 'query' => ['foo' => 'bar'] - ]); - -And finally, you can build up the query string of a request as needed by -calling the ``getQuery()`` method of a request and modifying the request's -``GuzzleHttp\Query`` object as needed. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httpbin.org'); - $query = $request->getQuery(); - $query->set('foo', 'bar'); - - // You can use the query string object like an array - $query['baz'] = 'bam'; - - // The query object can be cast to a string - echo $query; - // foo=bar&baz=bam - - // Setting a value to false or null will cause the "=" sign to be omitted - $query['empty'] = null; - echo $query; - // foo=bar&baz=bam&empty - - // Use an empty string to include the "=" sign with an empty value - $query['empty'] = ''; - echo $query; - // foo=bar&baz=bam&empty= - -.. _headers: - -Request and Response Headers ----------------------------- - -You can specify request headers when sending or creating requests with a -client. In the following example, we send the ``X-Foo-Header`` with a value of -``value`` by setting the ``headers`` request option. - -.. code-block:: php - - $response = $client->get('http://httpbin.org/get', [ - 'headers' => ['X-Foo-Header' => 'value'] - ]); - -You can view the headers of a response using header specific methods of a -response class. Headers work exactly the same way for request and response -object. - -You can retrieve a header from a request or response using the ``getHeader()`` -method of the object. This method is case-insensitive and by default will -return a string containing the header field value. - -.. code-block:: php - - $response = $client->get('http://www.yahoo.com'); - $length = $response->getHeader('Content-Length'); - -Header fields that contain multiple values can be retrieved as a string or as -an array. Retrieving the field values as a string will naively concatenate all -of the header values together with a comma. Because not all header fields -should be represented this way (e.g., ``Set-Cookie``), you can pass an optional -flag to the ``getHeader()`` method to retrieve the header values as an array. - -.. code-block:: php - - $values = $response->getHeader('Set-Cookie', true); - foreach ($values as $value) { - echo $value; - } - -You can test if a request or response has a specific header using the -``hasHeader()`` method. This method accepts a case-insensitive string and -returns true if the header is present or false if it is not. - -You can retrieve all of the headers of a message using the ``getHeaders()`` -method of a request or response. The return value is an associative array where -the keys represent the header name as it will be sent over the wire, and each -value is an array of strings associated with the header. - -.. code-block:: php - - $headers = $response->getHeaders(); - foreach ($message->getHeaders() as $name => $values) { - echo $name . ": " . implode(", ", $values); - } - -Modifying headers ------------------ - -The headers of a message can be modified using the ``setHeader()``, -``addHeader()``, ``setHeaders()``, and ``removeHeader()`` methods of a request -or response object. - -.. code-block:: php - - $request = $client->createRequest('GET', 'http://httpbin.org/get'); - - // Set a single value for a header - $request->setHeader('User-Agent', 'Testing!'); - - // Set multiple values for a header in one call - $request->setHeader('X-Foo', ['Baz', 'Bar']); - - // Add a header to the message - $request->addHeader('X-Foo', 'Bam'); - - echo $request->getHeader('X-Foo'); - // Baz, Bar, Bam - - // Remove a specific header using a case-insensitive name - $request->removeHeader('x-foo'); - echo $request->getHeader('X-Foo'); - // Echoes an empty string: '' - -Uploading Data -============== - -Guzzle provides several methods of uploading data. - -You can send requests that contain a stream of data by passing a string, -resource returned from ``fopen``, or a ``GuzzleHttp\Stream\StreamInterface`` -object to the ``body`` request option. - -.. code-block:: php - - $r = $client->post('http://httpbin.org/post', ['body' => 'raw data']); - -You can easily upload JSON data using the ``json`` request option. - -.. code-block:: php - - $r = $client->put('http://httpbin.org/put', ['json' => ['foo' => 'bar']]); - -POST Requests -------------- - -In addition to specifying the raw data of a request using the ``body`` request -option, Guzzle provides helpful abstractions over sending POST data. - -Sending POST Fields -~~~~~~~~~~~~~~~~~~~ - -Sending ``application/x-www-form-urlencoded`` POST requests requires that you -specify the body of a POST request as an array. - -.. code-block:: php - - $response = $client->post('http://httpbin.org/post', [ - 'body' => [ - 'field_name' => 'abc', - 'other_field' => '123' - ] - ]); - -You can also build up POST requests before sending them. - -.. code-block:: php - - $request = $client->createRequest('POST', 'http://httpbin.org/post'); - $postBody = $request->getBody(); - - // $postBody is an instance of GuzzleHttp\Post\PostBodyInterface - $postBody->setField('foo', 'bar'); - echo $postBody->getField('foo'); - // 'bar' - - echo json_encode($postBody->getFields()); - // {"foo": "bar"} - - // Send the POST request - $response = $client->send($request); - -Sending POST Files -~~~~~~~~~~~~~~~~~~ - -Sending ``multipart/form-data`` POST requests (POST requests that contain -files) is the same as sending ``application/x-www-form-urlencoded``, except -some of the array values of the POST fields map to PHP ``fopen`` resources, or -``GuzzleHttp\Stream\StreamInterface``, or -``GuzzleHttp\Post\PostFileInterface`` objects. - -.. code-block:: php - - use GuzzleHttp\Post\PostFile; - - $response = $client->post('http://httpbin.org/post', [ - 'body' => [ - 'field_name' => 'abc', - 'file_filed' => fopen('/path/to/file', 'r'), - 'other_file' => new PostFile('other_file', 'this is the content') - ] - ]); - -Just like when sending POST fields, you can also build up POST requests with -files before sending them. - -.. code-block:: php - - use GuzzleHttp\Post\PostFile; - - $request = $client->createRequest('POST', 'http://httpbin.org/post'); - $postBody = $request->getBody(); - $postBody->setField('foo', 'bar'); - $postBody->addFile(new PostFile('test', fopen('/path/to/file', 'r'))); - $response = $client->send($request); - -Cookies -======= - -Guzzle can maintain a cookie session for you if instructed using the -``cookies`` request option. - -- Set to ``true`` to use a shared cookie session associated with the client. -- Pass an associative array containing cookies to send in the request and start - a new cookie session. -- Set to a ``GuzzleHttp\Subscriber\CookieJar\CookieJarInterface`` object to use - an existing cookie jar. - -Redirects -========= - -Guzzle will automatically follow redirects unless you tell it not to. You can -customize the redirect behavior using the ``allow_redirects`` request option. - -- Set to true to enable normal redirects with a maximum number of 5 redirects. - This is the default setting. -- Set to false to disable redirects. -- Pass an associative array containing the 'max' key to specify the maximum - number of redirects and optionally provide a 'strict' key value to specify - whether or not to use strict RFC compliant redirects (meaning redirect POST - requests with POST requests vs. doing what most browsers do which is - redirect POST requests with GET requests). - -.. code-block:: php - - $response = $client->get('http://github.com'); - echo $response->getStatusCode(); - // 200 - echo $response->getEffectiveUrl(); - // 'https://github.com/' - -The following example shows that redirects can be disabled. - -.. code-block:: php - - $response = $client->get('http://github.com', ['allow_redirects' => false]); - echo $response->getStatusCode(); - // 301 - echo $response->getEffectiveUrl(); - // 'http://github.com/' - -Exceptions -========== - -Guzzle throws exceptions for errors that occur during a transfer. - -- In the event of a networking error (connection timeout, DNS errors, etc.), - a ``GuzzleHttp\Exception\RequestException`` is thrown. This exception - extends from ``GuzzleHttp\Exception\TransferException``. Catching this - exception will catch any exception that can be thrown while transferring - (non-parallel) requests. - - .. code-block:: php - - use GuzzleHttp\Exception\RequestException; - - try { - $client->get('https://github.com/_abc_123_404'); - } catch (RequestException $e) { - echo $e->getRequest(); - if ($e->hasResponse()) { - echo $e->getResponse(); - } - } - -- A ``GuzzleHttp\Exception\ClientException`` is thrown for 400 - level errors if the ``exceptions`` request option is set to true. This - exception extends from ``GuzzleHttp\Exception\BadResponseException`` and - ``GuzzleHttp\Exception\BadResponseException`` extends from - ``GuzzleHttp\Exception\RequestException``. - - .. code-block:: php - - use GuzzleHttp\Exception\ClientException; - - try { - $client->get('https://github.com/_abc_123_404'); - } catch (ClientException $e) { - echo $e->getRequest(); - echo $e->getResponse(); - } - -- A ``GuzzleHttp\Exception\ServerException`` is thrown for 500 level - errors if the ``exceptions`` request option is set to true. This - exception extends from ``GuzzleHttp\Exception\BadResponseException``. -- A ``GuzzleHttp\Exception\TooManyRedirectsException`` is thrown when too - many redirects are followed. This exception extends from ``GuzzleHttp\Exception\RequestException``. - -All of the above exceptions extend from -``GuzzleHttp\Exception\TransferException``. diff --git a/vendor/guzzlehttp/guzzle/docs/requirements.txt b/vendor/guzzlehttp/guzzle/docs/requirements.txt deleted file mode 100644 index fe7a4eab..00000000 --- a/vendor/guzzlehttp/guzzle/docs/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -Sphinx>=1.2b1 -guzzle_sphinx_theme>=0.6.0 diff --git a/vendor/guzzlehttp/guzzle/docs/streams.rst b/vendor/guzzlehttp/guzzle/docs/streams.rst deleted file mode 100644 index 8fe9a698..00000000 --- a/vendor/guzzlehttp/guzzle/docs/streams.rst +++ /dev/null @@ -1,213 +0,0 @@ -======= -Streams -======= - -Guzzle uses stream objects to represent request and response message bodies. -These stream objects allow you to work with various types of data all using a -common interface. - -HTTP messages consist of a start-line, headers, and a body. The body of an HTTP -message can be very small or extremely large. Attempting to represent the body -of a message as a string can easily consume more memory than intended because -the body must be stored completely in memory. Attempting to store the body of a -request or response in memory would preclude the use of that implementation from -being able to work with large message bodies. The StreamInterface is used in -order to hide the implementation details of where a stream of data is read from -or written to. - -Guzzle's StreamInterface exposes several methods that enable streams to be read -from, written to, and traversed effectively. - -Streams expose their capabilities using three methods: ``isReadable()``, -``isWritable()``, and ``isSeekable()``. These methods can be used by stream -collaborators to determine if a stream is capable of their requirements. - -Each stream instance has various capabilities: they can be read-only, -write-only, read-write, allow arbitrary random access (seeking forwards or -backwards to any location), or only allow sequential access (for example in the -case of a socket or pipe). - -Creating Streams -================ - -The best way to create a stream is using the static factory method, -``GuzzleHttp\Stream\Stream::factory()``. This factory accepts strings, -resources returned from ``fopen()``, an object that implements -``__toString()``, and an object that implements -``GuzzleHttp\Stream\StreamInterface``. - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - - $stream = Stream::factory('string data'); - echo $stream; - // string data - echo $stream->read(3); - // str - echo $stream->getContents(); - // ing data - var_export($stream->eof()); - // true - var_export($stream->tell()); - // 11 - -Metadata -======== - -Guzzle streams expose stream metadata through the ``getMetadata()`` method. -This method provides the data you would retrieve when calling PHP's -`stream_get_meta_data() function `_, -and can optionally expose other custom data. - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - - $resource = fopen('/path/to/file', 'r'); - $stream = Stream::factory($resource); - echo $stream->getMetadata('uri'); - // /path/to/file - var_export($stream->isReadable()); - // true - var_export($stream->isWritable()); - // false - var_export($stream->isSeekable()); - // true - -Stream Decorators -================= - -With the small and focused interface, add custom functionality to streams is -very simple with stream decorators. Guzzle provides several built-in decorators -that provide additional stream functionality. - -CachingStream -------------- - -The CachingStream is used to allow seeking over previously read bytes on -non-seekable streams. This can be useful when transferring a non-seekable -entity body fails due to needing to rewind the stream (for example, resulting -from a redirect). Data that is read from the remote stream will be buffered in -a PHP temp stream so that previously read bytes are cached first in memory, -then on disk. - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - use GuzzleHttp\Stream\CachingStream; - - $original = Stream::factory(fopen('http://www.google.com', 'r')); - $stream = new CachingStream($original); - - $stream->read(1024); - echo $stream->tell(); - // 1024 - - $stream->seek(0); - echo $stream->tell(); - // 0 - -LimitStream ------------ - -LimitStream can be used to read a subset or slice of an existing stream object. -This can be useful for breaking a large file into smaller pieces to be sent in -chunks (e.g. Amazon S3's multipart upload API). - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - use GuzzleHttp\Stream\LimitStream; - - $original = Stream::factory(fopen('/tmp/test.txt', 'r+')); - echo $original->getSize(); - // >>> 1048576 - - // Limit the size of the body to 1024 bytes and start reading from byte 2048 - $stream = new LimitStream($original, 1024, 2048); - echo $stream->getSize(); - // >>> 1024 - echo $stream->tell(); - // >>> 0 - -NoSeekStream ------------- - -NoSeekStream wraps a stream and does not allow seeking. - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - use GuzzleHttp\Stream\LimitStream; - - $original = Stream::factory('foo'); - $noSeek = new NoSeekStream($original); - - echo $noSeek->read(3); - // foo - var_export($noSeek->isSeekable()); - // false - $noSeek->seek(0); - var_export($noSeek->read(3)); - // NULL - -Creating Custom Decorators --------------------------- - -Creating a stream decorator is very easy thanks to the -``GuzzleHttp\Stream\StreamDecoratorTrait``. This trait provides methods that -implement ``GuzzleHttp\Stream\StreamInterface`` by proxying to an underlying -stream. Just ``use`` the ``StreamDecoratorTrait`` and implement your custom -methods. - -For example, let's say we wanted to call a specific function each time the last -byte is read from a stream. This could be implemented by overriding the -``read()`` method. - -.. code-block:: php - - use GuzzleHttp\Stream\StreamDecoratorTrait; - - class EofCallbackStream implements StreamInterface - { - use StreamDecoratorTrait; - - private $callback; - - public function __construct(StreamInterface $stream, callable $callback) - { - $this->stream = $stream; - $this->callback = $callback; - } - - public function read($length) - { - $result = $this->stream->read($length); - - // Invoke the callback when EOF is hit. - if ($this->eof()) { - call_user_func($this->callback); - } - - return $result; - } - } - -This decorator could be added to any existing stream and used like so: - -.. code-block:: php - - use GuzzleHttp\Stream\Stream; - - $original = Stream::factory('foo'); - $eofStream = new EofCallbackStream($original, function () { - echo 'EOF!'; - }); - - $eofStream->read(2); - $eofStream->read(1); - // echoes "EOF!" - $eofStream->seek(0); - $eofStream->read(3); - // echoes "EOF!" diff --git a/vendor/guzzlehttp/guzzle/docs/testing.rst b/vendor/guzzlehttp/guzzle/docs/testing.rst deleted file mode 100644 index 03bcc2ee..00000000 --- a/vendor/guzzlehttp/guzzle/docs/testing.rst +++ /dev/null @@ -1,232 +0,0 @@ -====================== -Testing Guzzle Clients -====================== - -Guzzle provides several tools that will enable you to easily mock the HTTP -layer without needing to send requests over the internet. - -* Mock subscriber -* Mock handler -* Node.js web server for integration testing - -Mock Subscriber -=============== - -When testing HTTP clients, you often need to simulate specific scenarios like -returning a successful response, returning an error, or returning specific -responses in a certain order. Because unit tests need to be predictable, easy -to bootstrap, and fast, hitting an actual remote API is a test smell. - -Guzzle provides a mock subscriber that can be attached to clients or requests -that allows you to queue up a list of responses to use rather than hitting a -remote API. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Subscriber\Mock; - use GuzzleHttp\Message\Response; - - $client = new Client(); - - // Create a mock subscriber and queue two responses. - $mock = new Mock([ - new Response(200, ['X-Foo' => 'Bar']), // Use response object - "HTTP/1.1 202 OK\r\nContent-Length: 0\r\n\r\n" // Use a response string - ]); - - // Add the mock subscriber to the client. - $client->getEmitter()->attach($mock); - // The first request is intercepted with the first response. - echo $client->get('/')->getStatusCode(); - //> 200 - // The second request is intercepted with the second response. - echo $client->get('/')->getStatusCode(); - //> 202 - -When no more responses are in the queue and a request is sent, an -``OutOfBoundsException`` is thrown. - -History Subscriber -================== - -When using things like the ``Mock`` subscriber, you often need to know if the -requests you expected to send were sent exactly as you intended. While the mock -subscriber responds with mocked responses, the ``GuzzleHttp\Subscriber\History`` -subscriber maintains a history of the requests that were sent by a client. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Subscriber\History; - - $client = new Client(); - $history = new History(); - - // Add the history subscriber to the client. - $client->getEmitter()->attach($history); - - $client->get('http://httpbin.org/get'); - $client->head('http://httpbin.org/get'); - - // Count the number of transactions - echo count($history); - //> 2 - // Get the last request - $lastRequest = $history->getLastRequest(); - // Get the last response - $lastResponse = $history->getLastResponse(); - - // Iterate over the transactions that were sent - foreach ($history as $transaction) { - echo $transaction['request']->getMethod(); - //> GET, HEAD - echo $transaction['response']->getStatusCode(); - //> 200, 200 - } - -The history subscriber can also be printed, revealing the requests and -responses that were sent as a string, in order. - -.. code-block:: php - - echo $history; - -:: - - > GET /get HTTP/1.1 - Host: httpbin.org - User-Agent: Guzzle/4.0-dev curl/7.21.4 PHP/5.5.8 - - < HTTP/1.1 200 OK - Access-Control-Allow-Origin: * - Content-Type: application/json - Date: Tue, 25 Mar 2014 03:53:27 GMT - Server: gunicorn/0.17.4 - Content-Length: 270 - Connection: keep-alive - - { - "headers": { - "Connection": "close", - "X-Request-Id": "3d0f7d5c-c937-4394-8248-2b8e03fcccdb", - "User-Agent": "Guzzle/4.0-dev curl/7.21.4 PHP/5.5.8", - "Host": "httpbin.org" - }, - "origin": "76.104.247.1", - "args": {}, - "url": "http://httpbin.org/get" - } - - > HEAD /get HTTP/1.1 - Host: httpbin.org - User-Agent: Guzzle/4.0-dev curl/7.21.4 PHP/5.5.8 - - < HTTP/1.1 200 OK - Access-Control-Allow-Origin: * - Content-length: 270 - Content-Type: application/json - Date: Tue, 25 Mar 2014 03:53:27 GMT - Server: gunicorn/0.17.4 - Connection: keep-alive - -Mock Adapter -============ - -In addition to using the Mock subscriber, you can use the -``GuzzleHttp\Ring\Client\MockHandler`` as the handler of a client to return the -same response over and over or return the result of a callable function. - -Test Web Server -=============== - -Using mock responses is almost always enough when testing a web service client. -When implementing custom :doc:`HTTP handlers `, you'll need to send -actual HTTP requests in order to sufficiently test the handler. However, a -best practice is to contact a local web server rather than a server over the -internet. - -- Tests are more reliable -- Tests do not require a network connection -- Tests have no external dependencies - -Using the test server ---------------------- - -.. warning:: - - The following functionality is provided to help developers of Guzzle - develop HTTP handlers. There is no promise of backwards compatibility - when it comes to the node.js test server or the ``GuzzleHttp\Tests\Server`` - class. If you are using the test server or ``Server`` class outside of - guzzlehttp/guzzle, then you will need to configure autoloading and - ensure the web server is started manually. - -.. hint:: - - You almost never need to use this test web server. You should only ever - consider using it when developing HTTP handlers. The test web server - is not necessary for mocking requests. For that, please use the - Mock subcribers and History subscriber. - -Guzzle ships with a node.js test server that receives requests and returns -responses from a queue. The test server exposes a simple API that is used to -enqueue responses and inspect the requests that it has received. - -Any operation on the ``Server`` object will ensure that -the server is running and wait until it is able to receive requests before -returning. - -.. code-block:: php - - use GuzzleHttp\Client; - use GuzzleHttp\Tests\Server; - - // Start the server and queue a response - Server::enqueue("HTTP/1.1 200 OK\r\n\Content-Length: 0r\n\r\n"); - - $client = new Client(['base_url' => Server::$url]); - echo $client->get('/foo')->getStatusCode(); - // 200 - -``GuzzleHttp\Tests\Server`` provides a static interface to the test server. You -can queue an HTTP response or an array of responses by calling -``Server::enqueue()``. This method accepts a string representing an HTTP -response message, a ``GuzzleHttp\Message\ResponseInterface``, or an array of -HTTP message strings / ``GuzzleHttp\Message\ResponseInterface`` objects. - -.. code-block:: php - - // Queue single response - Server::enqueue("HTTP/1.1 200 OK\r\n\Content-Length: 0r\n\r\n"); - - // Clear the queue and queue an array of responses - Server::enqueue([ - "HTTP/1.1 200 OK\r\n\Content-Length: 0r\n\r\n", - "HTTP/1.1 404 Not Found\r\n\Content-Length: 0r\n\r\n" - ]); - -When a response is queued on the test server, the test server will remove any -previously queued responses. As the server receives requests, queued responses -are dequeued and returned to the request. When the queue is empty, the server -will return a 500 response. - -You can inspect the requests that the server has retrieved by calling -``Server::received()``. This method accepts an optional ``$hydrate`` parameter -that specifies if you are retrieving an array of HTTP requests as strings or an -array of ``GuzzleHttp\Message\RequestInterface`` objects. - -.. code-block:: php - - foreach (Server::received() as $response) { - echo $response; - } - -You can clear the list of received requests from the web server using the -``Server::flush()`` method. - -.. code-block:: php - - Server::flush(); - echo count(Server::received()); - // 0 diff --git a/vendor/guzzlehttp/guzzle/phpunit.xml.dist b/vendor/guzzlehttp/guzzle/phpunit.xml.dist deleted file mode 100644 index 500cd53a..00000000 --- a/vendor/guzzlehttp/guzzle/phpunit.xml.dist +++ /dev/null @@ -1,17 +0,0 @@ - - - - - tests - - - - - src - - src/ - - - - diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php index b5ed11ff..fa1038da 100644 --- a/vendor/guzzlehttp/guzzle/src/Client.php +++ b/vendor/guzzlehttp/guzzle/src/Client.php @@ -199,9 +199,12 @@ protected function getDefaultOptions() 'verify' => true ]; - // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set - if ($proxy = getenv('HTTP_PROXY')) { - $settings['proxy']['http'] = $proxy; + // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. + // We can only trust the HTTP_PROXY environment variable in a CLI + // process due to the fact that PHP has no reliable mechanism to + // get environment variables that start with "HTTP_". + if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) { + $settings['proxy']['http'] = getenv('HTTP_PROXY'); } if ($proxy = getenv('HTTPS_PROXY')) { diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php index 63f0174d..6668597d 100644 --- a/vendor/guzzlehttp/guzzle/src/ClientInterface.php +++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php @@ -11,7 +11,7 @@ */ interface ClientInterface extends HasEmitterInterface { - const VERSION = '5.3.0'; + const VERSION = '5.3.1'; /** * Create and return a new {@see RequestInterface} object. diff --git a/vendor/guzzlehttp/guzzle/src/Event/Emitter.php b/vendor/guzzlehttp/guzzle/src/Event/Emitter.php index 4e44f45e..d034fdae 100644 --- a/vendor/guzzlehttp/guzzle/src/Event/Emitter.php +++ b/vendor/guzzlehttp/guzzle/src/Event/Emitter.php @@ -43,8 +43,7 @@ public function on($eventName, callable $listener, $priority = 0) public function once($eventName, callable $listener, $priority = 0) { $onceListener = function ( - EventInterface $event, - $eventName + EventInterface $event ) use (&$onceListener, $eventName, $listener, $priority) { $this->removeListener($eventName, $onceListener); $listener($event, $eventName); diff --git a/vendor/guzzlehttp/guzzle/src/Message/AbstractMessage.php b/vendor/guzzlehttp/guzzle/src/Message/AbstractMessage.php index 0c675758..f118e0fe 100644 --- a/vendor/guzzlehttp/guzzle/src/Message/AbstractMessage.php +++ b/vendor/guzzlehttp/guzzle/src/Message/AbstractMessage.php @@ -107,7 +107,7 @@ public function setHeaders(array $headers) { $this->headers = $this->headerNames = []; foreach ($headers as $key => $value) { - $this->setHeader($key, $value); + $this->addHeader($key, $value); } } diff --git a/vendor/guzzlehttp/guzzle/src/Message/MessageFactory.php b/vendor/guzzlehttp/guzzle/src/Message/MessageFactory.php index 85984e2d..d469ef1e 100644 --- a/vendor/guzzlehttp/guzzle/src/Message/MessageFactory.php +++ b/vendor/guzzlehttp/guzzle/src/Message/MessageFactory.php @@ -87,7 +87,7 @@ public function createRequest($method, $url, array $options = []) unset($options['config']); // Use a POST body by default - if ($method == 'POST' + if (strtoupper($method) == 'POST' && !isset($options['body']) && !isset($options['json']) ) { diff --git a/vendor/guzzlehttp/guzzle/tests/BatchResultsTest.php b/vendor/guzzlehttp/guzzle/tests/BatchResultsTest.php deleted file mode 100644 index 080d44c0..00000000 --- a/vendor/guzzlehttp/guzzle/tests/BatchResultsTest.php +++ /dev/null @@ -1,58 +0,0 @@ -assertCount(3, $batch); - $this->assertEquals([$a, $b, $c], $batch->getKeys()); - $this->assertEquals([$hash[$c]], $batch->getFailures()); - $this->assertEquals(['1', '2'], $batch->getSuccessful()); - $this->assertEquals('1', $batch->getResult($a)); - $this->assertNull($batch->getResult(new \stdClass())); - $this->assertTrue(isset($batch[0])); - $this->assertFalse(isset($batch[10])); - $this->assertEquals('1', $batch[0]); - $this->assertEquals('2', $batch[1]); - $this->assertNull($batch[100]); - $this->assertInstanceOf('Exception', $batch[2]); - - $results = iterator_to_array($batch); - $this->assertEquals(['1', '2', $hash[$c]], $results); - } - - /** - * @expectedException \RuntimeException - */ - public function testCannotSetByIndex() - { - $hash = new \SplObjectStorage(); - $batch = new BatchResults($hash); - $batch[10] = 'foo'; - } - - /** - * @expectedException \RuntimeException - */ - public function testCannotUnsetByIndex() - { - $hash = new \SplObjectStorage(); - $batch = new BatchResults($hash); - unset($batch[10]); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/ClientTest.php b/vendor/guzzlehttp/guzzle/tests/ClientTest.php deleted file mode 100644 index 02db3eb9..00000000 --- a/vendor/guzzlehttp/guzzle/tests/ClientTest.php +++ /dev/null @@ -1,647 +0,0 @@ -ma = function () { - throw new \RuntimeException('Should not have been called.'); - }; - } - - public function testUsesDefaultDefaultOptions() - { - $client = new Client(); - $this->assertTrue($client->getDefaultOption('allow_redirects')); - $this->assertTrue($client->getDefaultOption('exceptions')); - $this->assertTrue($client->getDefaultOption('verify')); - } - - public function testUsesProvidedDefaultOptions() - { - $client = new Client([ - 'defaults' => [ - 'allow_redirects' => false, - 'query' => ['foo' => 'bar'] - ] - ]); - $this->assertFalse($client->getDefaultOption('allow_redirects')); - $this->assertTrue($client->getDefaultOption('exceptions')); - $this->assertTrue($client->getDefaultOption('verify')); - $this->assertEquals(['foo' => 'bar'], $client->getDefaultOption('query')); - } - - public function testCanSpecifyBaseUrl() - { - $this->assertSame('', (new Client())->getBaseUrl()); - $this->assertEquals('http://foo', (new Client([ - 'base_url' => 'http://foo' - ]))->getBaseUrl()); - } - - public function testCanSpecifyBaseUrlUriTemplate() - { - $client = new Client(['base_url' => ['http://foo.com/{var}/', ['var' => 'baz']]]); - $this->assertEquals('http://foo.com/baz/', $client->getBaseUrl()); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesUriTemplateValue() - { - new Client(['base_url' => ['http://foo.com/']]); - } - - /** - * @expectedException \Exception - * @expectedExceptionMessage Foo - */ - public function testCanSpecifyHandler() - { - $client = new Client(['handler' => function () { - throw new \Exception('Foo'); - }]); - $client->get('http://httpbin.org'); - } - - /** - * @expectedException \Exception - * @expectedExceptionMessage Foo - */ - public function testCanSpecifyHandlerAsAdapter() - { - $client = new Client(['adapter' => function () { - throw new \Exception('Foo'); - }]); - $client->get('http://httpbin.org'); - } - - /** - * @expectedException \Exception - * @expectedExceptionMessage Foo - */ - public function testCanSpecifyMessageFactory() - { - $factory = $this->getMockBuilder('GuzzleHttp\Message\MessageFactoryInterface') - ->setMethods(['createRequest']) - ->getMockForAbstractClass(); - $factory->expects($this->once()) - ->method('createRequest') - ->will($this->throwException(new \Exception('Foo'))); - $client = new Client(['message_factory' => $factory]); - $client->get(); - } - - public function testCanSpecifyEmitter() - { - $emitter = $this->getMockBuilder('GuzzleHttp\Event\EmitterInterface') - ->setMethods(['listeners']) - ->getMockForAbstractClass(); - $emitter->expects($this->once()) - ->method('listeners') - ->will($this->returnValue('foo')); - - $client = new Client(['emitter' => $emitter]); - $this->assertEquals('foo', $client->getEmitter()->listeners()); - } - - public function testAddsDefaultUserAgentHeaderWithDefaultOptions() - { - $client = new Client(['defaults' => ['allow_redirects' => false]]); - $this->assertFalse($client->getDefaultOption('allow_redirects')); - $this->assertEquals( - ['User-Agent' => Utils::getDefaultUserAgent()], - $client->getDefaultOption('headers') - ); - } - - public function testAddsDefaultUserAgentHeaderWithoutDefaultOptions() - { - $client = new Client(); - $this->assertEquals( - ['User-Agent' => Utils::getDefaultUserAgent()], - $client->getDefaultOption('headers') - ); - } - - private function getRequestClient() - { - $client = $this->getMockBuilder('GuzzleHttp\Client') - ->setMethods(['send']) - ->getMock(); - $client->expects($this->once()) - ->method('send') - ->will($this->returnArgument(0)); - - return $client; - } - - public function requestMethodProvider() - { - return [ - ['GET', false], - ['HEAD', false], - ['DELETE', false], - ['OPTIONS', false], - ['POST', 'foo'], - ['PUT', 'foo'], - ['PATCH', 'foo'] - ]; - } - - /** - * @dataProvider requestMethodProvider - */ - public function testClientProvidesMethodShortcut($method, $body) - { - $client = $this->getRequestClient(); - if ($body) { - $request = $client->{$method}('http://foo.com', [ - 'headers' => ['X-Baz' => 'Bar'], - 'body' => $body, - 'query' => ['a' => 'b'] - ]); - } else { - $request = $client->{$method}('http://foo.com', [ - 'headers' => ['X-Baz' => 'Bar'], - 'query' => ['a' => 'b'] - ]); - } - $this->assertEquals($method, $request->getMethod()); - $this->assertEquals('Bar', $request->getHeader('X-Baz')); - $this->assertEquals('a=b', $request->getQuery()); - if ($body) { - $this->assertEquals($body, $request->getBody()); - } - } - - public function testClientMergesDefaultOptionsWithRequestOptions() - { - $f = $this->getMockBuilder('GuzzleHttp\Message\MessageFactoryInterface') - ->setMethods(array('createRequest')) - ->getMockForAbstractClass(); - - $o = null; - // Intercept the creation - $f->expects($this->once()) - ->method('createRequest') - ->will($this->returnCallback( - function ($method, $url, array $options = []) use (&$o) { - $o = $options; - return (new MessageFactory())->createRequest($method, $url, $options); - } - )); - - $client = new Client([ - 'message_factory' => $f, - 'defaults' => [ - 'headers' => ['Foo' => 'Bar'], - 'query' => ['baz' => 'bam'], - 'exceptions' => false - ] - ]); - - $request = $client->createRequest('GET', 'http://foo.com?a=b', [ - 'headers' => ['Hi' => 'there', '1' => 'one'], - 'allow_redirects' => false, - 'query' => ['t' => 1] - ]); - - $this->assertFalse($o['allow_redirects']); - $this->assertFalse($o['exceptions']); - $this->assertEquals('Bar', $request->getHeader('Foo')); - $this->assertEquals('there', $request->getHeader('Hi')); - $this->assertEquals('one', $request->getHeader('1')); - $this->assertEquals('a=b&baz=bam&t=1', $request->getQuery()); - } - - public function testClientMergesDefaultHeadersCaseInsensitively() - { - $client = new Client(['defaults' => ['headers' => ['Foo' => 'Bar']]]); - $request = $client->createRequest('GET', 'http://foo.com?a=b', [ - 'headers' => ['foo' => 'custom', 'user-agent' => 'test'] - ]); - $this->assertEquals('test', $request->getHeader('User-Agent')); - $this->assertEquals('custom', $request->getHeader('Foo')); - } - - public function testCanOverrideDefaultOptionWithNull() - { - $client = new Client(['defaults' => ['proxy' => 'invalid!']]); - $request = $client->createRequest('GET', 'http://foo.com?a=b', [ - 'proxy' => null - ]); - $this->assertFalse($request->getConfig()->hasKey('proxy')); - } - - public function testDoesNotOverwriteExistingUA() - { - $client = new Client(['defaults' => [ - 'headers' => ['User-Agent' => 'test'] - ]]); - $this->assertEquals( - ['User-Agent' => 'test'], - $client->getDefaultOption('headers') - ); - } - - public function testUsesBaseUrlWhenNoUrlIsSet() - { - $client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']); - $this->assertEquals( - 'http://www.foo.com/baz?bam=bar', - $client->createRequest('GET')->getUrl() - ); - } - - public function testUsesBaseUrlCombinedWithProvidedUrl() - { - $client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']); - $this->assertEquals( - 'http://www.foo.com/bar/bam', - $client->createRequest('GET', 'bar/bam')->getUrl() - ); - } - - public function testFalsyPathsAreCombinedWithBaseUrl() - { - $client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']); - $this->assertEquals( - 'http://www.foo.com/0', - $client->createRequest('GET', '0')->getUrl() - ); - } - - public function testUsesBaseUrlCombinedWithProvidedUrlViaUriTemplate() - { - $client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']); - $this->assertEquals( - 'http://www.foo.com/bar/123', - $client->createRequest('GET', ['bar/{bam}', ['bam' => '123']])->getUrl() - ); - } - - public function testSettingAbsoluteUrlOverridesBaseUrl() - { - $client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']); - $this->assertEquals( - 'http://www.foo.com/foo', - $client->createRequest('GET', '/foo')->getUrl() - ); - } - - public function testSettingAbsoluteUriTemplateOverridesBaseUrl() - { - $client = new Client(['base_url' => 'http://www.foo.com/baz?bam=bar']); - $this->assertEquals( - 'http://goo.com/1', - $client->createRequest( - 'GET', - ['http://goo.com/{bar}', ['bar' => '1']] - )->getUrl() - ); - } - - public function testCanSetRelativeUrlStartingWithHttp() - { - $client = new Client(['base_url' => 'http://www.foo.com']); - $this->assertEquals( - 'http://www.foo.com/httpfoo', - $client->createRequest('GET', 'httpfoo')->getUrl() - ); - } - - /** - * Test that base URLs ending with a slash are resolved as per RFC3986. - * - * @link http://tools.ietf.org/html/rfc3986#section-5.2.3 - */ - public function testMultipleSubdirectoryWithSlash() - { - $client = new Client(['base_url' => 'http://www.foo.com/bar/bam/']); - $this->assertEquals( - 'http://www.foo.com/bar/bam/httpfoo', - $client->createRequest('GET', 'httpfoo')->getUrl() - ); - } - - /** - * Test that base URLs ending without a slash are resolved as per RFC3986. - * - * @link http://tools.ietf.org/html/rfc3986#section-5.2.3 - */ - public function testMultipleSubdirectoryNoSlash() - { - $client = new Client(['base_url' => 'http://www.foo.com/bar/bam']); - $this->assertEquals( - 'http://www.foo.com/bar/httpfoo', - $client->createRequest('GET', 'httpfoo')->getUrl() - ); - } - - public function testClientSendsRequests() - { - $mock = new MockHandler(['status' => 200, 'headers' => []]); - $client = new Client(['handler' => $mock]); - $response = $client->get('http://test.com'); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('http://test.com', $response->getEffectiveUrl()); - } - - public function testSendingRequestCanBeIntercepted() - { - $response = new Response(200); - $client = new Client(['handler' => $this->ma]); - $client->getEmitter()->on( - 'before', - function (BeforeEvent $e) use ($response) { - $e->intercept($response); - } - ); - $this->assertSame($response, $client->get('http://test.com')); - $this->assertEquals('http://test.com', $response->getEffectiveUrl()); - } - - /** - * @expectedException \GuzzleHttp\Exception\RequestException - * @expectedExceptionMessage Argument 1 passed to GuzzleHttp\Message\FutureResponse::proxy() must implement interface GuzzleHttp\Ring\Future\FutureInterface - */ - public function testEnsuresResponseIsPresentAfterSending() - { - $handler = function () {}; - $client = new Client(['handler' => $handler]); - $client->get('http://httpbin.org'); - } - - /** - * @expectedException \GuzzleHttp\Exception\RequestException - * @expectedExceptionMessage Waiting did not resolve future - */ - public function testEnsuresResponseIsPresentAfterDereferencing() - { - $deferred = new Deferred(); - $handler = new MockHandler(function () use ($deferred) { - return new FutureArray( - $deferred->promise(), - function () {} - ); - }); - $client = new Client(['handler' => $handler]); - $response = $client->get('http://httpbin.org'); - $response->wait(); - } - - public function testClientHandlesErrorsDuringBeforeSend() - { - $client = new Client(); - $client->getEmitter()->on('before', function ($e) { - throw new \Exception('foo'); - }); - $client->getEmitter()->on('error', function (ErrorEvent $e) { - $e->intercept(new Response(200)); - }); - $this->assertEquals( - 200, - $client->get('http://test.com')->getStatusCode() - ); - } - - /** - * @expectedException \GuzzleHttp\Exception\RequestException - * @expectedExceptionMessage foo - */ - public function testClientHandlesErrorsDuringBeforeSendAndThrowsIfUnhandled() - { - $client = new Client(); - $client->getEmitter()->on('before', function (BeforeEvent $e) { - throw new RequestException('foo', $e->getRequest()); - }); - $client->get('http://httpbin.org'); - } - - /** - * @expectedException \GuzzleHttp\Exception\RequestException - * @expectedExceptionMessage foo - */ - public function testClientWrapsExceptions() - { - $client = new Client(); - $client->getEmitter()->on('before', function (BeforeEvent $e) { - throw new \Exception('foo'); - }); - $client->get('http://httpbin.org'); - } - - public function testCanInjectResponseForFutureError() - { - $calledFuture = false; - $deferred = new Deferred(); - $future = new FutureArray( - $deferred->promise(), - function () use ($deferred, &$calledFuture) { - $calledFuture = true; - $deferred->resolve(['error' => new \Exception('Noo!')]); - } - ); - $mock = new MockHandler($future); - $client = new Client(['handler' => $mock]); - $called = 0; - $response = $client->get('http://localhost:123/foo', [ - 'future' => true, - 'events' => [ - 'error' => function (ErrorEvent $e) use (&$called) { - $called++; - $e->intercept(new Response(200)); - } - ] - ]); - $this->assertEquals(0, $called); - $this->assertInstanceOf('GuzzleHttp\Message\FutureResponse', $response); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertTrue($calledFuture); - $this->assertEquals(1, $called); - } - - public function testCanReturnFutureResults() - { - $called = false; - $deferred = new Deferred(); - $future = new FutureArray( - $deferred->promise(), - function () use ($deferred, &$called) { - $called = true; - $deferred->resolve(['status' => 201, 'headers' => []]); - } - ); - $mock = new MockHandler($future); - $client = new Client(['handler' => $mock]); - $response = $client->get('http://localhost:123/foo', ['future' => true]); - $this->assertFalse($called); - $this->assertInstanceOf('GuzzleHttp\Message\FutureResponse', $response); - $this->assertEquals(201, $response->getStatusCode()); - $this->assertTrue($called); - } - - public function testThrowsExceptionsWhenDereferenced() - { - $calledFuture = false; - $deferred = new Deferred(); - $future = new FutureArray( - $deferred->promise(), - function () use ($deferred, &$calledFuture) { - $calledFuture = true; - $deferred->resolve(['error' => new \Exception('Noop!')]); - } - ); - $client = new Client(['handler' => new MockHandler($future)]); - try { - $res = $client->get('http://localhost:123/foo', ['future' => true]); - $res->wait(); - $this->fail('Did not throw'); - } catch (RequestException $e) { - $this->assertEquals(1, $calledFuture); - } - } - - /** - * @expectedExceptionMessage Noo! - * @expectedException \GuzzleHttp\Exception\RequestException - */ - public function testThrowsExceptionsSynchronously() - { - $client = new Client([ - 'handler' => new MockHandler(['error' => new \Exception('Noo!')]) - ]); - $client->get('http://localhost:123/foo'); - } - - public function testCanSetDefaultValues() - { - $client = new Client(['foo' => 'bar']); - $client->setDefaultOption('headers/foo', 'bar'); - $this->assertNull($client->getDefaultOption('foo')); - $this->assertEquals('bar', $client->getDefaultOption('headers/foo')); - } - - public function testSendsAllInParallel() - { - $client = new Client(); - $client->getEmitter()->attach(new Mock([ - new Response(200), - new Response(201), - new Response(202), - ])); - $history = new History(); - $client->getEmitter()->attach($history); - - $requests = [ - $client->createRequest('GET', 'http://test.com'), - $client->createRequest('POST', 'http://test.com'), - $client->createRequest('PUT', 'http://test.com') - ]; - - $client->sendAll($requests); - $requests = array_map(function($r) { - return $r->getMethod(); - }, $history->getRequests()); - $this->assertContains('GET', $requests); - $this->assertContains('POST', $requests); - $this->assertContains('PUT', $requests); - } - - public function testCanDisableAuthPerRequest() - { - $client = new Client(['defaults' => ['auth' => 'foo']]); - $request = $client->createRequest('GET', 'http://test.com'); - $this->assertEquals('foo', $request->getConfig()['auth']); - $request = $client->createRequest('GET', 'http://test.com', ['auth' => null]); - $this->assertFalse($request->getConfig()->hasKey('auth')); - } - - public function testUsesProxyEnvironmentVariables() - { - $http = getenv('HTTP_PROXY'); - $https = getenv('HTTPS_PROXY'); - - $client = new Client(); - $this->assertNull($client->getDefaultOption('proxy')); - - putenv('HTTP_PROXY=127.0.0.1'); - $client = new Client(); - $this->assertEquals( - ['http' => '127.0.0.1'], - $client->getDefaultOption('proxy') - ); - - putenv('HTTPS_PROXY=127.0.0.2'); - $client = new Client(); - $this->assertEquals( - ['http' => '127.0.0.1', 'https' => '127.0.0.2'], - $client->getDefaultOption('proxy') - ); - - putenv("HTTP_PROXY=$http"); - putenv("HTTPS_PROXY=$https"); - } - - public function testReturnsFutureForErrorWhenRequested() - { - $client = new Client(['handler' => new MockHandler(['status' => 404])]); - $request = $client->createRequest('GET', 'http://localhost:123/foo', [ - 'future' => true - ]); - $res = $client->send($request); - $this->assertInstanceOf('GuzzleHttp\Message\FutureResponse', $res); - try { - $res->wait(); - $this->fail('did not throw'); - } catch (RequestException $e) { - $this->assertContains('404', $e->getMessage()); - } - } - - public function testReturnsFutureForResponseWhenRequested() - { - $client = new Client(['handler' => new MockHandler(['status' => 200])]); - $request = $client->createRequest('GET', 'http://localhost:123/foo', [ - 'future' => true - ]); - $res = $client->send($request); - $this->assertInstanceOf('GuzzleHttp\Message\FutureResponse', $res); - $this->assertEquals(200, $res->getStatusCode()); - } - - public function testCanUseUrlWithCustomQuery() - { - $client = new Client(); - $url = Url::fromString('http://foo.com/bar'); - $query = new Query(['baz' => '123%20']); - $query->setEncodingType(false); - $url->setQuery($query); - $r = $client->createRequest('GET', $url); - $this->assertEquals('http://foo.com/bar?baz=123%20', $r->getUrl()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/CollectionTest.php b/vendor/guzzlehttp/guzzle/tests/CollectionTest.php deleted file mode 100644 index 8c532aaf..00000000 --- a/vendor/guzzlehttp/guzzle/tests/CollectionTest.php +++ /dev/null @@ -1,416 +0,0 @@ -coll = new Collection(); - } - - public function testConstructorCanBeCalledWithNoParams() - { - $this->coll = new Collection(); - $p = $this->coll->toArray(); - $this->assertEmpty($p, '-> Collection must be empty when no data is passed'); - } - - public function testConstructorCanBeCalledWithParams() - { - $testData = array( - 'test' => 'value', - 'test_2' => 'value2' - ); - $this->coll = new Collection($testData); - $this->assertEquals($this->coll->toArray(), $testData); - $this->assertEquals($this->coll->toArray(), $this->coll->toArray()); - } - - public function testImplementsIteratorAggregate() - { - $this->coll->set('key', 'value'); - $this->assertInstanceOf('ArrayIterator', $this->coll->getIterator()); - $this->assertEquals(1, count($this->coll)); - $total = 0; - foreach ($this->coll as $key => $value) { - $this->assertEquals('key', $key); - $this->assertEquals('value', $value); - $total++; - } - $this->assertEquals(1, $total); - } - - public function testCanAddValuesToExistingKeysByUsingArray() - { - $this->coll->add('test', 'value1'); - $this->assertEquals($this->coll->toArray(), array('test' => 'value1')); - $this->coll->add('test', 'value2'); - $this->assertEquals($this->coll->toArray(), array('test' => array('value1', 'value2'))); - $this->coll->add('test', 'value3'); - $this->assertEquals($this->coll->toArray(), array('test' => array('value1', 'value2', 'value3'))); - } - - public function testHandlesMergingInDisparateDataSources() - { - $params = array( - 'test' => 'value1', - 'test2' => 'value2', - 'test3' => array('value3', 'value4') - ); - $this->coll->merge($params); - $this->assertEquals($this->coll->toArray(), $params); - $this->coll->merge(new Collection(['test4' => 'hi'])); - $this->assertEquals( - $this->coll->toArray(), - $params + ['test4' => 'hi'] - ); - } - - public function testCanClearAllDataOrSpecificKeys() - { - $this->coll->merge(array( - 'test' => 'value1', - 'test2' => 'value2' - )); - - // Clear a specific parameter by name - $this->coll->remove('test'); - - $this->assertEquals($this->coll->toArray(), array( - 'test2' => 'value2' - )); - - // Clear all parameters - $this->coll->clear(); - - $this->assertEquals($this->coll->toArray(), array()); - } - - public function testProvidesKeys() - { - $this->assertEquals(array(), $this->coll->getKeys()); - $this->coll->merge(array( - 'test1' => 'value1', - 'test2' => 'value2' - )); - $this->assertEquals(array('test1', 'test2'), $this->coll->getKeys()); - // Returns the cached array previously returned - $this->assertEquals(array('test1', 'test2'), $this->coll->getKeys()); - $this->coll->remove('test1'); - $this->assertEquals(array('test2'), $this->coll->getKeys()); - $this->coll->add('test3', 'value3'); - $this->assertEquals(array('test2', 'test3'), $this->coll->getKeys()); - } - - public function testChecksIfHasKey() - { - $this->assertFalse($this->coll->hasKey('test')); - $this->coll->add('test', 'value'); - $this->assertEquals(true, $this->coll->hasKey('test')); - $this->coll->add('test2', 'value2'); - $this->assertEquals(true, $this->coll->hasKey('test')); - $this->assertEquals(true, $this->coll->hasKey('test2')); - $this->assertFalse($this->coll->hasKey('testing')); - $this->assertEquals(false, $this->coll->hasKey('AB-C', 'junk')); - } - - public function testChecksIfHasValue() - { - $this->assertFalse($this->coll->hasValue('value')); - $this->coll->add('test', 'value'); - $this->assertEquals('test', $this->coll->hasValue('value')); - $this->coll->add('test2', 'value2'); - $this->assertEquals('test', $this->coll->hasValue('value')); - $this->assertEquals('test2', $this->coll->hasValue('value2')); - $this->assertFalse($this->coll->hasValue('val')); - } - - public function testImplementsCount() - { - $data = new Collection(); - $this->assertEquals(0, $data->count()); - $data->add('key', 'value'); - $this->assertEquals(1, count($data)); - $data->add('key', 'value2'); - $this->assertEquals(1, count($data)); - $data->add('key_2', 'value3'); - $this->assertEquals(2, count($data)); - } - - public function testAddParamsByMerging() - { - $params = array( - 'test' => 'value1', - 'test2' => 'value2', - 'test3' => array('value3', 'value4') - ); - - // Add some parameters - $this->coll->merge($params); - - // Add more parameters by merging them in - $this->coll->merge(array( - 'test' => 'another', - 'different_key' => 'new value' - )); - - $this->assertEquals(array( - 'test' => array('value1', 'another'), - 'test2' => 'value2', - 'test3' => array('value3', 'value4'), - 'different_key' => 'new value' - ), $this->coll->toArray()); - } - - public function testAllowsFunctionalFilter() - { - $this->coll->merge(array( - 'fruit' => 'apple', - 'number' => 'ten', - 'prepositions' => array('about', 'above', 'across', 'after'), - 'same_number' => 'ten' - )); - - $filtered = $this->coll->filter(function ($key, $value) { - return $value == 'ten'; - }); - - $this->assertNotSame($filtered, $this->coll); - - $this->assertEquals(array( - 'number' => 'ten', - 'same_number' => 'ten' - ), $filtered->toArray()); - } - - public function testAllowsFunctionalMapping() - { - $this->coll->merge(array( - 'number_1' => 1, - 'number_2' => 2, - 'number_3' => 3 - )); - - $mapped = $this->coll->map(function ($key, $value) { - return $value * $value; - }); - - $this->assertNotSame($mapped, $this->coll); - - $this->assertEquals(array( - 'number_1' => 1, - 'number_2' => 4, - 'number_3' => 9 - ), $mapped->toArray()); - } - - public function testImplementsArrayAccess() - { - $this->coll->merge(array( - 'k1' => 'v1', - 'k2' => 'v2' - )); - - $this->assertTrue($this->coll->offsetExists('k1')); - $this->assertFalse($this->coll->offsetExists('Krull')); - - $this->coll->offsetSet('k3', 'v3'); - $this->assertEquals('v3', $this->coll->offsetGet('k3')); - $this->assertEquals('v3', $this->coll->get('k3')); - - $this->coll->offsetUnset('k1'); - $this->assertFalse($this->coll->offsetExists('k1')); - } - - public function testCanReplaceAllData() - { - $this->coll->replace(array('a' => '123')); - $this->assertEquals(array('a' => '123'), $this->coll->toArray()); - } - - public function testPreparesFromConfig() - { - $c = Collection::fromConfig(array( - 'a' => '123', - 'base_url' => 'http://www.test.com/' - ), array( - 'a' => 'xyz', - 'b' => 'lol' - ), array('a')); - - $this->assertInstanceOf('GuzzleHttp\Collection', $c); - $this->assertEquals(array( - 'a' => '123', - 'b' => 'lol', - 'base_url' => 'http://www.test.com/' - ), $c->toArray()); - - try { - Collection::fromConfig(array(), array(), array('a')); - $this->fail('Exception not throw when missing config'); - } catch (\InvalidArgumentException $e) { - } - } - - function falseyDataProvider() - { - return array( - array(false, false), - array(null, null), - array('', ''), - array(array(), array()), - array(0, 0), - ); - } - - /** - * @dataProvider falseyDataProvider - */ - public function testReturnsCorrectData($a, $b) - { - $c = new Collection(array('value' => $a)); - $this->assertSame($b, $c->get('value')); - } - - public function testRetrievesNestedKeysUsingPath() - { - $data = array( - 'foo' => 'bar', - 'baz' => array( - 'mesa' => array( - 'jar' => 'jar' - ) - ) - ); - $collection = new Collection($data); - $this->assertEquals('bar', $collection->getPath('foo')); - $this->assertEquals('jar', $collection->getPath('baz/mesa/jar')); - $this->assertNull($collection->getPath('wewewf')); - $this->assertNull($collection->getPath('baz/mesa/jar/jar')); - } - - public function testFalseyKeysStillDescend() - { - $collection = new Collection(array( - '0' => array( - 'a' => 'jar' - ), - 1 => 'other' - )); - $this->assertEquals('jar', $collection->getPath('0/a')); - $this->assertEquals('other', $collection->getPath('1')); - } - - public function getPathProvider() - { - $data = array( - 'foo' => 'bar', - 'baz' => array( - 'mesa' => array( - 'jar' => 'jar', - 'array' => array('a', 'b', 'c') - ), - 'bar' => array( - 'baz' => 'bam', - 'array' => array('d', 'e', 'f') - ) - ), - 'bam' => array( - array('foo' => 1), - array('foo' => 2), - array('array' => array('h', 'i')) - ) - ); - $c = new Collection($data); - - return array( - // Simple path selectors - array($c, 'foo', 'bar'), - array($c, 'baz', $data['baz']), - array($c, 'bam', $data['bam']), - array($c, 'baz/mesa', $data['baz']['mesa']), - array($c, 'baz/mesa/jar', 'jar'), - // Does not barf on missing keys - array($c, 'fefwfw', null), - array($c, 'baz/mesa/array', $data['baz']['mesa']['array']) - ); - } - - /** - * @dataProvider getPathProvider - */ - public function testGetPath(Collection $c, $path, $expected, $separator = '/') - { - $this->assertEquals($expected, $c->getPath($path, $separator)); - } - - public function testOverridesSettings() - { - $c = new Collection(array('foo' => 1, 'baz' => 2, 'bar' => 3)); - $c->overwriteWith(array('foo' => 10, 'bar' => 300)); - $this->assertEquals(array('foo' => 10, 'baz' => 2, 'bar' => 300), $c->toArray()); - } - - public function testOverwriteWithCollection() - { - $c = new Collection(array('foo' => 1, 'baz' => 2, 'bar' => 3)); - $b = new Collection(array('foo' => 10, 'bar' => 300)); - $c->overwriteWith($b); - $this->assertEquals(array('foo' => 10, 'baz' => 2, 'bar' => 300), $c->toArray()); - } - - public function testOverwriteWithTraversable() - { - $c = new Collection(array('foo' => 1, 'baz' => 2, 'bar' => 3)); - $b = new Collection(array('foo' => 10, 'bar' => 300)); - $c->overwriteWith($b->getIterator()); - $this->assertEquals(array('foo' => 10, 'baz' => 2, 'bar' => 300), $c->toArray()); - } - - public function testCanSetNestedPathValueThatDoesNotExist() - { - $c = new Collection(array()); - $c->setPath('foo/bar/baz/123', 'hi'); - $this->assertEquals('hi', $c['foo']['bar']['baz']['123']); - } - - public function testCanSetNestedPathValueThatExists() - { - $c = new Collection(array('foo' => array('bar' => 'test'))); - $c->setPath('foo/bar', 'hi'); - $this->assertEquals('hi', $c['foo']['bar']); - } - - /** - * @expectedException \RuntimeException - */ - public function testVerifiesNestedPathIsValidAtExactLevel() - { - $c = new Collection(array('foo' => 'bar')); - $c->setPath('foo/bar', 'hi'); - $this->assertEquals('hi', $c['foo']['bar']); - } - - /** - * @expectedException \RuntimeException - */ - public function testVerifiesThatNestedPathIsValidAtAnyLevel() - { - $c = new Collection(array('foo' => 'bar')); - $c->setPath('foo/bar/baz', 'test'); - } - - public function testCanAppendToNestedPathValues() - { - $c = new Collection(); - $c->setPath('foo/bar/[]', 'a'); - $c->setPath('foo/bar/[]', 'b'); - $this->assertEquals(['a', 'b'], $c['foo']['bar']); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Cookie/CookieJarTest.php b/vendor/guzzlehttp/guzzle/tests/Cookie/CookieJarTest.php deleted file mode 100644 index 1360419d..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Cookie/CookieJarTest.php +++ /dev/null @@ -1,339 +0,0 @@ -jar = new CookieJar(); - } - - protected function getTestCookies() - { - return [ - new SetCookie(['Name' => 'foo', 'Value' => 'bar', 'Domain' => 'foo.com', 'Path' => '/', 'Discard' => true]), - new SetCookie(['Name' => 'test', 'Value' => '123', 'Domain' => 'baz.com', 'Path' => '/foo', 'Expires' => 2]), - new SetCookie(['Name' => 'you', 'Value' => '123', 'Domain' => 'bar.com', 'Path' => '/boo', 'Expires' => time() + 1000]) - ]; - } - - public function testQuotesBadCookieValues() - { - $this->assertEquals('foo', CookieJar::getCookieValue('foo')); - $this->assertEquals('"foo,bar"', CookieJar::getCookieValue('foo,bar')); - } - - public function testCreatesFromArray() - { - $jar = CookieJar::fromArray([ - 'foo' => 'bar', - 'baz' => 'bam' - ], 'example.com'); - $this->assertCount(2, $jar); - } - - /** - * Provides test data for cookie cookieJar retrieval - */ - public function getCookiesDataProvider() - { - return [ - [['foo', 'baz', 'test', 'muppet', 'googoo'], '', '', '', false], - [['foo', 'baz', 'muppet', 'googoo'], '', '', '', true], - [['googoo'], 'www.example.com', '', '', false], - [['muppet', 'googoo'], 'test.y.example.com', '', '', false], - [['foo', 'baz'], 'example.com', '', '', false], - [['muppet'], 'x.y.example.com', '/acme/', '', false], - [['muppet'], 'x.y.example.com', '/acme/test/', '', false], - [['googoo'], 'x.y.example.com', '/test/acme/test/', '', false], - [['foo', 'baz'], 'example.com', '', '', false], - [['baz'], 'example.com', '', 'baz', false], - ]; - } - - public function testStoresAndRetrievesCookies() - { - $cookies = $this->getTestCookies(); - foreach ($cookies as $cookie) { - $this->assertTrue($this->jar->setCookie($cookie)); - } - - $this->assertEquals(3, count($this->jar)); - $this->assertEquals(3, count($this->jar->getIterator())); - $this->assertEquals($cookies, $this->jar->getIterator()->getArrayCopy()); - } - - public function testRemovesTemporaryCookies() - { - $cookies = $this->getTestCookies(); - foreach ($this->getTestCookies() as $cookie) { - $this->jar->setCookie($cookie); - } - $this->jar->clearSessionCookies(); - $this->assertEquals( - [$cookies[1], $cookies[2]], - $this->jar->getIterator()->getArrayCopy() - ); - } - - public function testRemovesSelectively() - { - foreach ($this->getTestCookies() as $cookie) { - $this->jar->setCookie($cookie); - } - - // Remove foo.com cookies - $this->jar->clear('foo.com'); - $this->assertEquals(2, count($this->jar)); - // Try again, removing no further cookies - $this->jar->clear('foo.com'); - $this->assertEquals(2, count($this->jar)); - - // Remove bar.com cookies with path of /boo - $this->jar->clear('bar.com', '/boo'); - $this->assertEquals(1, count($this->jar)); - - // Remove cookie by name - $this->jar->clear(null, null, 'test'); - $this->assertEquals(0, count($this->jar)); - } - - public function testDoesNotAddIncompleteCookies() - { - $this->assertEquals(false, $this->jar->setCookie(new SetCookie())); - $this->assertFalse($this->jar->setCookie(new SetCookie(array( - 'Name' => 'foo' - )))); - $this->assertFalse($this->jar->setCookie(new SetCookie(array( - 'Name' => false - )))); - $this->assertFalse($this->jar->setCookie(new SetCookie(array( - 'Name' => true - )))); - $this->assertFalse($this->jar->setCookie(new SetCookie(array( - 'Name' => 'foo', - 'Domain' => 'foo.com' - )))); - } - - public function testDoesAddValidCookies() - { - $this->assertTrue($this->jar->setCookie(new SetCookie(array( - 'Name' => 'foo', - 'Domain' => 'foo.com', - 'Value' => 0 - )))); - $this->assertTrue($this->jar->setCookie(new SetCookie(array( - 'Name' => 'foo', - 'Domain' => 'foo.com', - 'Value' => 0.0 - )))); - $this->assertTrue($this->jar->setCookie(new SetCookie(array( - 'Name' => 'foo', - 'Domain' => 'foo.com', - 'Value' => '0' - )))); - } - - public function testOverwritesCookiesThatAreOlderOrDiscardable() - { - $t = time() + 1000; - $data = array( - 'Name' => 'foo', - 'Value' => 'bar', - 'Domain' => '.example.com', - 'Path' => '/', - 'Max-Age' => '86400', - 'Secure' => true, - 'Discard' => true, - 'Expires' => $t - ); - - // Make sure that the discard cookie is overridden with the non-discard - $this->assertTrue($this->jar->setCookie(new SetCookie($data))); - $this->assertEquals(1, count($this->jar)); - - $data['Discard'] = false; - $this->assertTrue($this->jar->setCookie(new SetCookie($data))); - $this->assertEquals(1, count($this->jar)); - - $c = $this->jar->getIterator()->getArrayCopy(); - $this->assertEquals(false, $c[0]->getDiscard()); - - // Make sure it doesn't duplicate the cookie - $this->jar->setCookie(new SetCookie($data)); - $this->assertEquals(1, count($this->jar)); - - // Make sure the more future-ful expiration date supersede the other - $data['Expires'] = time() + 2000; - $this->assertTrue($this->jar->setCookie(new SetCookie($data))); - $this->assertEquals(1, count($this->jar)); - $c = $this->jar->getIterator()->getArrayCopy(); - $this->assertNotEquals($t, $c[0]->getExpires()); - } - - public function testOverwritesCookiesThatHaveChanged() - { - $t = time() + 1000; - $data = array( - 'Name' => 'foo', - 'Value' => 'bar', - 'Domain' => '.example.com', - 'Path' => '/', - 'Max-Age' => '86400', - 'Secure' => true, - 'Discard' => true, - 'Expires' => $t - ); - - // Make sure that the discard cookie is overridden with the non-discard - $this->assertTrue($this->jar->setCookie(new SetCookie($data))); - - $data['Value'] = 'boo'; - $this->assertTrue($this->jar->setCookie(new SetCookie($data))); - $this->assertEquals(1, count($this->jar)); - - // Changing the value plus a parameter also must overwrite the existing one - $data['Value'] = 'zoo'; - $data['Secure'] = false; - $this->assertTrue($this->jar->setCookie(new SetCookie($data))); - $this->assertEquals(1, count($this->jar)); - - $c = $this->jar->getIterator()->getArrayCopy(); - $this->assertEquals('zoo', $c[0]->getValue()); - } - - public function testAddsCookiesFromResponseWithRequest() - { - $response = new Response(200, array( - 'Set-Cookie' => "fpc=d=.Hm.yh4.1XmJWjJfs4orLQzKzPImxklQoxXSHOZATHUSEFciRueW_7704iYUtsXNEXq0M92Px2glMdWypmJ7HIQl6XIUvrZimWjQ3vIdeuRbI.FNQMAfcxu_XN1zSx7l.AcPdKL6guHc2V7hIQFhnjRW0rxm2oHY1P4bGQxFNz7f.tHm12ZD3DbdMDiDy7TBXsuP4DM-&v=2; expires=Fri, 02-Mar-2019 02:17:40 GMT;" - )); - $request = new Request('GET', 'http://www.example.com'); - $this->jar->extractCookies($request, $response); - $this->assertEquals(1, count($this->jar)); - } - - public function getMatchingCookiesDataProvider() - { - return array( - array('https://example.com', 'foo=bar; baz=foobar'), - array('http://example.com', ''), - array('https://example.com:8912', 'foo=bar; baz=foobar'), - array('https://foo.example.com', 'foo=bar; baz=foobar'), - array('http://foo.example.com/test/acme/', 'googoo=gaga') - ); - } - - /** - * @dataProvider getMatchingCookiesDataProvider - */ - public function testReturnsCookiesMatchingRequests($url, $cookies) - { - $bag = [ - new SetCookie([ - 'Name' => 'foo', - 'Value' => 'bar', - 'Domain' => 'example.com', - 'Path' => '/', - 'Max-Age' => '86400', - 'Secure' => true - ]), - new SetCookie([ - 'Name' => 'baz', - 'Value' => 'foobar', - 'Domain' => 'example.com', - 'Path' => '/', - 'Max-Age' => '86400', - 'Secure' => true - ]), - new SetCookie([ - 'Name' => 'test', - 'Value' => '123', - 'Domain' => 'www.foobar.com', - 'Path' => '/path/', - 'Discard' => true - ]), - new SetCookie([ - 'Name' => 'muppet', - 'Value' => 'cookie_monster', - 'Domain' => '.y.example.com', - 'Path' => '/acme/', - 'Expires' => time() + 86400 - ]), - new SetCookie([ - 'Name' => 'googoo', - 'Value' => 'gaga', - 'Domain' => '.example.com', - 'Path' => '/test/acme/', - 'Max-Age' => 1500 - ]) - ]; - - foreach ($bag as $cookie) { - $this->jar->setCookie($cookie); - } - - $request = new Request('GET', $url); - $this->jar->addCookieHeader($request); - $this->assertEquals($cookies, $request->getHeader('Cookie')); - } - - /** - * @expectedException \RuntimeException - * @expectedExceptionMessage Invalid cookie: Cookie name must not cannot invalid characters: - */ - public function testThrowsExceptionWithStrictMode() - { - $a = new CookieJar(true); - $a->setCookie(new SetCookie(['Name' => "abc\n", 'Value' => 'foo', 'Domain' => 'bar'])); - } - - public function testDeletesCookiesByName() - { - $cookies = $this->getTestCookies(); - $cookies[] = new SetCookie([ - 'Name' => 'other', - 'Value' => '123', - 'Domain' => 'bar.com', - 'Path' => '/boo', - 'Expires' => time() + 1000 - ]); - $jar = new CookieJar(); - foreach ($cookies as $cookie) { - $jar->setCookie($cookie); - } - $this->assertCount(4, $jar); - $jar->clear('bar.com', '/boo', 'other'); - $this->assertCount(3, $jar); - $names = array_map(function (SetCookie $c) { - return $c->getName(); - }, $jar->getIterator()->getArrayCopy()); - $this->assertEquals(['foo', 'test', 'you'], $names); - } - - public function testCanConvertToAndLoadFromArray() - { - $jar = new CookieJar(true); - foreach ($this->getTestCookies() as $cookie) { - $jar->setCookie($cookie); - } - $this->assertCount(3, $jar); - $arr = $jar->toArray(); - $this->assertCount(3, $arr); - $newCookieJar = new CookieJar(false, $arr); - $this->assertCount(3, $newCookieJar); - $this->assertSame($jar->toArray(), $newCookieJar->toArray()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Cookie/FileCookieJarTest.php b/vendor/guzzlehttp/guzzle/tests/Cookie/FileCookieJarTest.php deleted file mode 100644 index 1d113371..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Cookie/FileCookieJarTest.php +++ /dev/null @@ -1,71 +0,0 @@ -file = tempnam('/tmp', 'file-cookies'); - } - - /** - * @expectedException \RuntimeException - */ - public function testValidatesCookieFile() - { - file_put_contents($this->file, 'true'); - new FileCookieJar($this->file); - } - - public function testLoadsFromFileFile() - { - $jar = new FileCookieJar($this->file); - $this->assertEquals([], $jar->getIterator()->getArrayCopy()); - unlink($this->file); - } - - public function testPersistsToFileFile() - { - $jar = new FileCookieJar($this->file); - $jar->setCookie(new SetCookie([ - 'Name' => 'foo', - 'Value' => 'bar', - 'Domain' => 'foo.com', - 'Expires' => time() + 1000 - ])); - $jar->setCookie(new SetCookie([ - 'Name' => 'baz', - 'Value' => 'bar', - 'Domain' => 'foo.com', - 'Expires' => time() + 1000 - ])); - $jar->setCookie(new SetCookie([ - 'Name' => 'boo', - 'Value' => 'bar', - 'Domain' => 'foo.com', - ])); - - $this->assertEquals(3, count($jar)); - unset($jar); - - // Make sure it wrote to the file - $contents = file_get_contents($this->file); - $this->assertNotEmpty($contents); - - // Load the cookieJar from the file - $jar = new FileCookieJar($this->file); - - // Weeds out temporary and session cookies - $this->assertEquals(2, count($jar)); - unset($jar); - unlink($this->file); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Cookie/SessionCookieJarTest.php b/vendor/guzzlehttp/guzzle/tests/Cookie/SessionCookieJarTest.php deleted file mode 100644 index ccc6d4ee..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Cookie/SessionCookieJarTest.php +++ /dev/null @@ -1,76 +0,0 @@ -sessionVar = 'sessionKey'; - - if (!isset($_SESSION)) { - $_SESSION = array(); - } - } - - /** - * @expectedException \RuntimeException - */ - public function testValidatesCookieSession() - { - $_SESSION[$this->sessionVar] = 'true'; - new SessionCookieJar($this->sessionVar); - } - - public function testLoadsFromSession() - { - $jar = new SessionCookieJar($this->sessionVar); - $this->assertEquals([], $jar->getIterator()->getArrayCopy()); - unset($_SESSION[$this->sessionVar]); - } - - public function testPersistsToSession() - { - $jar = new SessionCookieJar($this->sessionVar); - $jar->setCookie(new SetCookie([ - 'Name' => 'foo', - 'Value' => 'bar', - 'Domain' => 'foo.com', - 'Expires' => time() + 1000 - ])); - $jar->setCookie(new SetCookie([ - 'Name' => 'baz', - 'Value' => 'bar', - 'Domain' => 'foo.com', - 'Expires' => time() + 1000 - ])); - $jar->setCookie(new SetCookie([ - 'Name' => 'boo', - 'Value' => 'bar', - 'Domain' => 'foo.com', - ])); - - $this->assertEquals(3, count($jar)); - unset($jar); - - // Make sure it wrote to the sessionVar in $_SESSION - $contents = $_SESSION[$this->sessionVar]; - $this->assertNotEmpty($contents); - - // Load the cookieJar from the file - $jar = new SessionCookieJar($this->sessionVar); - - // Weeds out temporary and session cookies - $this->assertEquals(2, count($jar)); - unset($jar); - unset($_SESSION[$this->sessionVar]); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Cookie/SetCookieTest.php b/vendor/guzzlehttp/guzzle/tests/Cookie/SetCookieTest.php deleted file mode 100644 index 3ddd0820..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Cookie/SetCookieTest.php +++ /dev/null @@ -1,364 +0,0 @@ -assertEquals('/', $cookie->getPath()); - } - - public function testConvertsDateTimeMaxAgeToUnixTimestamp() - { - $cookie = new SetCookie(['Expires' => 'November 20, 1984']); - $this->assertInternalType('integer', $cookie->getExpires()); - } - - public function testAddsExpiresBasedOnMaxAge() - { - $t = time(); - $cookie = new SetCookie(['Max-Age' => 100]); - $this->assertEquals($t + 100, $cookie->getExpires()); - } - - public function testHoldsValues() - { - $t = time(); - $data = array( - 'Name' => 'foo', - 'Value' => 'baz', - 'Path' => '/bar', - 'Domain' => 'baz.com', - 'Expires' => $t, - 'Max-Age' => 100, - 'Secure' => true, - 'Discard' => true, - 'HttpOnly' => true, - 'foo' => 'baz', - 'bar' => 'bam' - ); - - $cookie = new SetCookie($data); - $this->assertEquals($data, $cookie->toArray()); - - $this->assertEquals('foo', $cookie->getName()); - $this->assertEquals('baz', $cookie->getValue()); - $this->assertEquals('baz.com', $cookie->getDomain()); - $this->assertEquals('/bar', $cookie->getPath()); - $this->assertEquals($t, $cookie->getExpires()); - $this->assertEquals(100, $cookie->getMaxAge()); - $this->assertTrue($cookie->getSecure()); - $this->assertTrue($cookie->getDiscard()); - $this->assertTrue($cookie->getHttpOnly()); - $this->assertEquals('baz', $cookie->toArray()['foo']); - $this->assertEquals('bam', $cookie->toArray()['bar']); - - $cookie->setName('a'); - $cookie->setValue('b'); - $cookie->setPath('c'); - $cookie->setDomain('bar.com'); - $cookie->setExpires(10); - $cookie->setMaxAge(200); - $cookie->setSecure(false); - $cookie->setHttpOnly(false); - $cookie->setDiscard(false); - - $this->assertEquals('a', $cookie->getName()); - $this->assertEquals('b', $cookie->getValue()); - $this->assertEquals('c', $cookie->getPath()); - $this->assertEquals('bar.com', $cookie->getDomain()); - $this->assertEquals(10, $cookie->getExpires()); - $this->assertEquals(200, $cookie->getMaxAge()); - $this->assertFalse($cookie->getSecure()); - $this->assertFalse($cookie->getDiscard()); - $this->assertFalse($cookie->getHttpOnly()); - } - - public function testDeterminesIfExpired() - { - $c = new SetCookie(); - $c->setExpires(10); - $this->assertTrue($c->isExpired()); - $c->setExpires(time() + 10000); - $this->assertFalse($c->isExpired()); - } - - public function testMatchesDomain() - { - $cookie = new SetCookie(); - $this->assertTrue($cookie->matchesDomain('baz.com')); - - $cookie->setDomain('baz.com'); - $this->assertTrue($cookie->matchesDomain('baz.com')); - $this->assertFalse($cookie->matchesDomain('bar.com')); - - $cookie->setDomain('.baz.com'); - $this->assertTrue($cookie->matchesDomain('.baz.com')); - $this->assertTrue($cookie->matchesDomain('foo.baz.com')); - $this->assertFalse($cookie->matchesDomain('baz.bar.com')); - $this->assertTrue($cookie->matchesDomain('baz.com')); - - $cookie->setDomain('.127.0.0.1'); - $this->assertTrue($cookie->matchesDomain('127.0.0.1')); - - $cookie->setDomain('127.0.0.1'); - $this->assertTrue($cookie->matchesDomain('127.0.0.1')); - - $cookie->setDomain('.com.'); - $this->assertFalse($cookie->matchesDomain('baz.com')); - - $cookie->setDomain('.local'); - $this->assertTrue($cookie->matchesDomain('example.local')); - } - - public function testMatchesPath() - { - $cookie = new SetCookie(); - $this->assertTrue($cookie->matchesPath('/foo')); - - $cookie->setPath('/foo'); - $this->assertTrue($cookie->matchesPath('/foo')); - $this->assertTrue($cookie->matchesPath('/foo/bar')); - $this->assertFalse($cookie->matchesPath('/bar')); - } - - public function cookieValidateProvider() - { - return array( - array('foo', 'baz', 'bar', true), - array('0', '0', '0', true), - array('', 'baz', 'bar', 'The cookie name must not be empty'), - array('foo', '', 'bar', 'The cookie value must not be empty'), - array('foo', 'baz', '', 'The cookie domain must not be empty'), - array("foo\r", 'baz', '0', 'Cookie name must not cannot invalid characters: =,; \t\r\n\013\014'), - ); - } - - /** - * @dataProvider cookieValidateProvider - */ - public function testValidatesCookies($name, $value, $domain, $result) - { - $cookie = new SetCookie(array( - 'Name' => $name, - 'Value' => $value, - 'Domain' => $domain - )); - $this->assertSame($result, $cookie->validate()); - } - - public function testDoesNotMatchIp() - { - $cookie = new SetCookie(['Domain' => '192.168.16.']); - $this->assertFalse($cookie->matchesDomain('192.168.16.121')); - } - - public function testConvertsToString() - { - $t = 1382916008; - $cookie = new SetCookie([ - 'Name' => 'test', - 'Value' => '123', - 'Domain' => 'foo.com', - 'Expires' => $t, - 'Path' => '/abc', - 'HttpOnly' => true, - 'Secure' => true - ]); - $this->assertEquals( - 'test=123; Domain=foo.com; Path=/abc; Expires=Sun, 27 Oct 2013 23:20:08 GMT; Secure; HttpOnly', - (string) $cookie - ); - } - - /** - * Provides the parsed information from a cookie - * - * @return array - */ - public function cookieParserDataProvider() - { - return array( - array( - 'ASIHTTPRequestTestCookie=This+is+the+value; expires=Sat, 26-Jul-2008 17:00:42 GMT; path=/tests; domain=allseeing-i.com; PHPSESSID=6c951590e7a9359bcedde25cda73e43c; path=/";', - array( - 'Domain' => 'allseeing-i.com', - 'Path' => '/', - 'PHPSESSID' => '6c951590e7a9359bcedde25cda73e43c', - 'Max-Age' => NULL, - 'Expires' => 'Sat, 26-Jul-2008 17:00:42 GMT', - 'Secure' => NULL, - 'Discard' => NULL, - 'Name' => 'ASIHTTPRequestTestCookie', - 'Value' => 'This+is+the+value', - 'HttpOnly' => false - ) - ), - array('', []), - array('foo', []), - // Test setting a blank value for a cookie - array(array( - 'foo=', 'foo =', 'foo =;', 'foo= ;', 'foo =', 'foo= '), - array( - 'Name' => 'foo', - 'Value' => '', - 'Discard' => null, - 'Domain' => null, - 'Expires' => null, - 'Max-Age' => null, - 'Path' => '/', - 'Secure' => null, - 'HttpOnly' => false - ) - ), - // Test setting a value and removing quotes - array(array( - 'foo=1', 'foo =1', 'foo =1;', 'foo=1 ;', 'foo =1', 'foo= 1', 'foo = 1 ;', 'foo="1"', 'foo="1";', 'foo= "1";'), - array( - 'Name' => 'foo', - 'Value' => '1', - 'Discard' => null, - 'Domain' => null, - 'Expires' => null, - 'Max-Age' => null, - 'Path' => '/', - 'Secure' => null, - 'HttpOnly' => false - ) - ), - // Some of the following tests are based on http://framework.zend.com/svn/framework/standard/trunk/tests/Zend/Http/CookieTest.php - array( - 'justacookie=foo; domain=example.com', - array( - 'Name' => 'justacookie', - 'Value' => 'foo', - 'Domain' => 'example.com', - 'Discard' => null, - 'Expires' => null, - 'Max-Age' => null, - 'Path' => '/', - 'Secure' => null, - 'HttpOnly' => false - ) - ), - array( - 'expires=tomorrow; secure; path=/Space Out/; expires=Tue, 21-Nov-2006 08:33:44 GMT; domain=.example.com', - array( - 'Name' => 'expires', - 'Value' => 'tomorrow', - 'Domain' => '.example.com', - 'Path' => '/Space Out/', - 'Expires' => 'Tue, 21-Nov-2006 08:33:44 GMT', - 'Discard' => null, - 'Secure' => true, - 'Max-Age' => null, - 'HttpOnly' => false - ) - ), - array( - 'domain=unittests; expires=Tue, 21-Nov-2006 08:33:44 GMT; domain=example.com; path=/some value/', - array( - 'Name' => 'domain', - 'Value' => 'unittests', - 'Domain' => 'example.com', - 'Path' => '/some value/', - 'Expires' => 'Tue, 21-Nov-2006 08:33:44 GMT', - 'Secure' => false, - 'Discard' => null, - 'Max-Age' => null, - 'HttpOnly' => false - ) - ), - array( - 'path=indexAction; path=/; domain=.foo.com; expires=Tue, 21-Nov-2006 08:33:44 GMT', - array( - 'Name' => 'path', - 'Value' => 'indexAction', - 'Domain' => '.foo.com', - 'Path' => '/', - 'Expires' => 'Tue, 21-Nov-2006 08:33:44 GMT', - 'Secure' => false, - 'Discard' => null, - 'Max-Age' => null, - 'HttpOnly' => false - ) - ), - array( - 'secure=sha1; secure; SECURE; domain=some.really.deep.domain.com; version=1; Max-Age=86400', - array( - 'Name' => 'secure', - 'Value' => 'sha1', - 'Domain' => 'some.really.deep.domain.com', - 'Path' => '/', - 'Secure' => true, - 'Discard' => null, - 'Expires' => time() + 86400, - 'Max-Age' => 86400, - 'HttpOnly' => false, - 'version' => '1' - ) - ), - array( - 'PHPSESSID=123456789+abcd%2Cef; secure; discard; domain=.localdomain; path=/foo/baz; expires=Tue, 21-Nov-2006 08:33:44 GMT;', - array( - 'Name' => 'PHPSESSID', - 'Value' => '123456789+abcd%2Cef', - 'Domain' => '.localdomain', - 'Path' => '/foo/baz', - 'Expires' => 'Tue, 21-Nov-2006 08:33:44 GMT', - 'Secure' => true, - 'Discard' => true, - 'Max-Age' => null, - 'HttpOnly' => false - ) - ), - ); - } - - /** - * @dataProvider cookieParserDataProvider - */ - public function testParseCookie($cookie, $parsed) - { - foreach ((array) $cookie as $v) { - $c = SetCookie::fromString($v); - $p = $c->toArray(); - - if (isset($p['Expires'])) { - // Remove expires values from the assertion if they are relatively equal - if (abs($p['Expires'] != strtotime($parsed['Expires'])) < 40) { - unset($p['Expires']); - unset($parsed['Expires']); - } - } - - if (!empty($parsed)) { - foreach ($parsed as $key => $value) { - $this->assertEquals($parsed[$key], $p[$key], 'Comparing ' . $key . ' ' . var_export($value, true) . ' : ' . var_export($parsed, true) . ' | ' . var_export($p, true)); - } - foreach ($p as $key => $value) { - $this->assertEquals($p[$key], $parsed[$key], 'Comparing ' . $key . ' ' . var_export($value, true) . ' : ' . var_export($parsed, true) . ' | ' . var_export($p, true)); - } - } else { - $this->assertEquals([ - 'Name' => null, - 'Value' => null, - 'Domain' => null, - 'Path' => '/', - 'Max-Age' => null, - 'Expires' => null, - 'Secure' => false, - 'Discard' => false, - 'HttpOnly' => false, - ], $p); - } - } - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/AbstractEventTest.php b/vendor/guzzlehttp/guzzle/tests/Event/AbstractEventTest.php deleted file mode 100644 index b8c06f15..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/AbstractEventTest.php +++ /dev/null @@ -1,14 +0,0 @@ -getMockBuilder('GuzzleHttp\Event\AbstractEvent') - ->getMockForAbstractClass(); - $this->assertFalse($e->isPropagationStopped()); - $e->stopPropagation(); - $this->assertTrue($e->isPropagationStopped()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/AbstractRequestEventTest.php b/vendor/guzzlehttp/guzzle/tests/Event/AbstractRequestEventTest.php deleted file mode 100644 index 50536c58..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/AbstractRequestEventTest.php +++ /dev/null @@ -1,33 +0,0 @@ -getMockBuilder('GuzzleHttp\Event\AbstractRequestEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $this->assertSame($t->client, $e->getClient()); - $this->assertSame($t->request, $e->getRequest()); - } - - public function testHasTransaction() - { - $t = new Transaction(new Client(), new Request('GET', '/')); - $e = $this->getMockBuilder('GuzzleHttp\Event\AbstractRequestEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $r = new \ReflectionMethod($e, 'getTransaction'); - $r->setAccessible(true); - $this->assertSame($t, $r->invoke($e)); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/AbstractRetryableEventTest.php b/vendor/guzzlehttp/guzzle/tests/Event/AbstractRetryableEventTest.php deleted file mode 100644 index 6a39d8bb..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/AbstractRetryableEventTest.php +++ /dev/null @@ -1,37 +0,0 @@ -transferInfo = ['foo' => 'bar']; - $e = $this->getMockBuilder('GuzzleHttp\Event\AbstractRetryableEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $e->retry(); - $this->assertTrue($e->isPropagationStopped()); - $this->assertEquals('retry', $t->state); - } - - public function testCanRetryAfterDelay() - { - $t = new Transaction(new Client(), new Request('GET', '/')); - $t->transferInfo = ['foo' => 'bar']; - $e = $this->getMockBuilder('GuzzleHttp\Event\AbstractRetryableEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $e->retry(10); - $this->assertTrue($e->isPropagationStopped()); - $this->assertEquals('retry', $t->state); - $this->assertEquals(10, $t->request->getConfig()->get('delay')); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/AbstractTransferEventTest.php b/vendor/guzzlehttp/guzzle/tests/Event/AbstractTransferEventTest.php deleted file mode 100644 index 5313c8e7..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/AbstractTransferEventTest.php +++ /dev/null @@ -1,59 +0,0 @@ -transferInfo = ['foo' => 'bar']; - $e = $this->getMockBuilder('GuzzleHttp\Event\AbstractTransferEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $this->assertNull($e->getTransferInfo('baz')); - $this->assertEquals('bar', $e->getTransferInfo('foo')); - $this->assertEquals($t->transferInfo, $e->getTransferInfo()); - } - - public function testHasResponse() - { - $t = new Transaction(new Client(), new Request('GET', '/')); - $t->response = new Response(200); - $e = $this->getMockBuilder('GuzzleHttp\Event\AbstractTransferEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $this->assertTrue($e->hasResponse()); - $this->assertSame($t->response, $e->getResponse()); - } - - public function testCanInterceptWithResponse() - { - $t = new Transaction(new Client(), new Request('GET', '/')); - $r = new Response(200); - $e = $this->getMockBuilder('GuzzleHttp\Event\AbstractTransferEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $e->intercept($r); - $this->assertSame($t->response, $r); - $this->assertSame($t->response, $e->getResponse()); - $this->assertTrue($e->isPropagationStopped()); - } - - public function testReturnsNumberOfRetries() - { - $t = new Transaction(new Client(), new Request('GET', '/')); - $t->retries = 2; - $e = $this->getMockBuilder('GuzzleHttp\Event\AbstractTransferEvent') - ->setConstructorArgs([$t]) - ->getMockForAbstractClass(); - $this->assertEquals(2, $e->getRetryCount()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/BeforeEventTest.php b/vendor/guzzlehttp/guzzle/tests/Event/BeforeEventTest.php deleted file mode 100644 index 469e4e25..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/BeforeEventTest.php +++ /dev/null @@ -1,26 +0,0 @@ -exception = new \Exception('foo'); - $e = new BeforeEvent($t); - $response = new Response(200); - $e->intercept($response); - $this->assertTrue($e->isPropagationStopped()); - $this->assertSame($t->response, $response); - $this->assertNull($t->exception); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/EmitterTest.php b/vendor/guzzlehttp/guzzle/tests/Event/EmitterTest.php deleted file mode 100644 index 5b7061bc..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/EmitterTest.php +++ /dev/null @@ -1,363 +0,0 @@ -emitter = new Emitter(); - $this->listener = new TestEventListener(); - } - - protected function tearDown() - { - $this->emitter = null; - $this->listener = null; - } - - public function testInitialState() - { - $this->assertEquals(array(), $this->emitter->listeners()); - } - - public function testAddListener() - { - $this->emitter->on('pre.foo', array($this->listener, 'preFoo')); - $this->emitter->on('post.foo', array($this->listener, 'postFoo')); - $this->assertTrue($this->emitter->hasListeners(self::preFoo)); - $this->assertTrue($this->emitter->hasListeners(self::preFoo)); - $this->assertCount(1, $this->emitter->listeners(self::postFoo)); - $this->assertCount(1, $this->emitter->listeners(self::postFoo)); - $this->assertCount(2, $this->emitter->listeners()); - } - - public function testGetListenersSortsByPriority() - { - $listener1 = new TestEventListener(); - $listener2 = new TestEventListener(); - $listener3 = new TestEventListener(); - $listener1->name = '1'; - $listener2->name = '2'; - $listener3->name = '3'; - - $this->emitter->on('pre.foo', array($listener1, 'preFoo'), -10); - $this->emitter->on('pre.foo', array($listener2, 'preFoo'), 10); - $this->emitter->on('pre.foo', array($listener3, 'preFoo')); - - $expected = array( - array($listener2, 'preFoo'), - array($listener3, 'preFoo'), - array($listener1, 'preFoo'), - ); - - $this->assertSame($expected, $this->emitter->listeners('pre.foo')); - } - - public function testGetAllListenersSortsByPriority() - { - $listener1 = new TestEventListener(); - $listener2 = new TestEventListener(); - $listener3 = new TestEventListener(); - $listener4 = new TestEventListener(); - $listener5 = new TestEventListener(); - $listener6 = new TestEventListener(); - - $this->emitter->on('pre.foo', [$listener1, 'preFoo'], -10); - $this->emitter->on('pre.foo', [$listener2, 'preFoo']); - $this->emitter->on('pre.foo', [$listener3, 'preFoo'], 10); - $this->emitter->on('post.foo', [$listener4, 'preFoo'], -10); - $this->emitter->on('post.foo', [$listener5, 'preFoo']); - $this->emitter->on('post.foo', [$listener6, 'preFoo'], 10); - - $expected = [ - 'pre.foo' => [[$listener3, 'preFoo'], [$listener2, 'preFoo'], [$listener1, 'preFoo']], - 'post.foo' => [[$listener6, 'preFoo'], [$listener5, 'preFoo'], [$listener4, 'preFoo']], - ]; - - $this->assertSame($expected, $this->emitter->listeners()); - } - - public function testDispatch() - { - $this->emitter->on('pre.foo', array($this->listener, 'preFoo')); - $this->emitter->on('post.foo', array($this->listener, 'postFoo')); - $this->emitter->emit(self::preFoo, $this->getEvent()); - $this->assertTrue($this->listener->preFooInvoked); - $this->assertFalse($this->listener->postFooInvoked); - $this->assertInstanceOf('GuzzleHttp\Event\EventInterface', $this->emitter->emit(self::preFoo, $this->getEvent())); - $event = $this->getEvent(); - $return = $this->emitter->emit(self::preFoo, $event); - $this->assertSame($event, $return); - } - - public function testDispatchForClosure() - { - $invoked = 0; - $listener = function () use (&$invoked) { - $invoked++; - }; - $this->emitter->on('pre.foo', $listener); - $this->emitter->on('post.foo', $listener); - $this->emitter->emit(self::preFoo, $this->getEvent()); - $this->assertEquals(1, $invoked); - } - - public function testStopEventPropagation() - { - $otherListener = new TestEventListener(); - - // postFoo() stops the propagation, so only one listener should - // be executed - // Manually set priority to enforce $this->listener to be called first - $this->emitter->on('post.foo', array($this->listener, 'postFoo'), 10); - $this->emitter->on('post.foo', array($otherListener, 'preFoo')); - $this->emitter->emit(self::postFoo, $this->getEvent()); - $this->assertTrue($this->listener->postFooInvoked); - $this->assertFalse($otherListener->postFooInvoked); - } - - public function testDispatchByPriority() - { - $invoked = array(); - $listener1 = function () use (&$invoked) { - $invoked[] = '1'; - }; - $listener2 = function () use (&$invoked) { - $invoked[] = '2'; - }; - $listener3 = function () use (&$invoked) { - $invoked[] = '3'; - }; - $this->emitter->on('pre.foo', $listener1, -10); - $this->emitter->on('pre.foo', $listener2); - $this->emitter->on('pre.foo', $listener3, 10); - $this->emitter->emit(self::preFoo, $this->getEvent()); - $this->assertEquals(array('3', '2', '1'), $invoked); - } - - public function testRemoveListener() - { - $this->emitter->on('pre.bar', [$this->listener, 'preFoo']); - $this->assertNotEmpty($this->emitter->listeners(self::preBar)); - $this->emitter->removeListener('pre.bar', [$this->listener, 'preFoo']); - $this->assertEmpty($this->emitter->listeners(self::preBar)); - $this->emitter->removeListener('notExists', [$this->listener, 'preFoo']); - } - - public function testAddSubscriber() - { - $eventSubscriber = new TestEventSubscriber(); - $this->emitter->attach($eventSubscriber); - $this->assertNotEmpty($this->emitter->listeners(self::preFoo)); - $this->assertNotEmpty($this->emitter->listeners(self::postFoo)); - } - - public function testAddSubscriberWithMultiple() - { - $eventSubscriber = new TestEventSubscriberWithMultiple(); - $this->emitter->attach($eventSubscriber); - $listeners = $this->emitter->listeners('pre.foo'); - $this->assertNotEmpty($this->emitter->listeners(self::preFoo)); - $this->assertCount(2, $listeners); - } - - public function testAddSubscriberWithPriorities() - { - $eventSubscriber = new TestEventSubscriber(); - $this->emitter->attach($eventSubscriber); - - $eventSubscriber = new TestEventSubscriberWithPriorities(); - $this->emitter->attach($eventSubscriber); - - $listeners = $this->emitter->listeners('pre.foo'); - $this->assertNotEmpty($this->emitter->listeners(self::preFoo)); - $this->assertCount(2, $listeners); - $this->assertInstanceOf('GuzzleHttp\Tests\Event\TestEventSubscriberWithPriorities', $listeners[0][0]); - } - - public function testdetach() - { - $eventSubscriber = new TestEventSubscriber(); - $this->emitter->attach($eventSubscriber); - $this->assertNotEmpty($this->emitter->listeners(self::preFoo)); - $this->assertNotEmpty($this->emitter->listeners(self::postFoo)); - $this->emitter->detach($eventSubscriber); - $this->assertEmpty($this->emitter->listeners(self::preFoo)); - $this->assertEmpty($this->emitter->listeners(self::postFoo)); - } - - public function testdetachWithPriorities() - { - $eventSubscriber = new TestEventSubscriberWithPriorities(); - $this->emitter->attach($eventSubscriber); - $this->assertNotEmpty($this->emitter->listeners(self::preFoo)); - $this->assertNotEmpty($this->emitter->listeners(self::postFoo)); - $this->emitter->detach($eventSubscriber); - $this->assertEmpty($this->emitter->listeners(self::preFoo)); - $this->assertEmpty($this->emitter->listeners(self::postFoo)); - } - - public function testEventReceivesEventNameAsArgument() - { - $listener = new TestWithDispatcher(); - $this->emitter->on('test', array($listener, 'foo')); - $this->assertNull($listener->name); - $this->emitter->emit('test', $this->getEvent()); - $this->assertEquals('test', $listener->name); - } - - /** - * @see https://bugs.php.net/bug.php?id=62976 - * - * This bug affects: - * - The PHP 5.3 branch for versions < 5.3.18 - * - The PHP 5.4 branch for versions < 5.4.8 - * - The PHP 5.5 branch is not affected - */ - public function testWorkaroundForPhpBug62976() - { - $dispatcher = new Emitter(); - $dispatcher->on('bug.62976', new CallableClass()); - $dispatcher->removeListener('bug.62976', function () {}); - $this->assertNotEmpty($dispatcher->listeners('bug.62976')); - } - - public function testRegistersEventsOnce() - { - $this->emitter->once('pre.foo', array($this->listener, 'preFoo')); - $this->emitter->on('pre.foo', array($this->listener, 'preFoo')); - $this->assertCount(2, $this->emitter->listeners(self::preFoo)); - $this->emitter->emit(self::preFoo, $this->getEvent()); - $this->assertTrue($this->listener->preFooInvoked); - $this->assertCount(1, $this->emitter->listeners(self::preFoo)); - } - - public function testReturnsEmptyArrayForNonExistentEvent() - { - $this->assertEquals([], $this->emitter->listeners('doesnotexist')); - } - - public function testCanAddFirstAndLastListeners() - { - $b = ''; - $this->emitter->on('foo', function () use (&$b) { $b .= 'a'; }, 'first'); // 1 - $this->emitter->on('foo', function () use (&$b) { $b .= 'b'; }, 'last'); // 0 - $this->emitter->on('foo', function () use (&$b) { $b .= 'c'; }, 'first'); // 2 - $this->emitter->on('foo', function () use (&$b) { $b .= 'd'; }, 'first'); // 3 - $this->emitter->on('foo', function () use (&$b) { $b .= 'e'; }, 'first'); // 4 - $this->emitter->on('foo', function () use (&$b) { $b .= 'f'; }); // 0 - $this->emitter->emit('foo', $this->getEvent()); - $this->assertEquals('edcabf', $b); - } - - /** - * @return \GuzzleHttp\Event\EventInterface - */ - private function getEvent() - { - return $this->getMockBuilder('GuzzleHttp\Event\AbstractEvent') - ->getMockForAbstractClass(); - } -} - -class CallableClass -{ - public function __invoke() - { - } -} - -class TestEventListener -{ - public $preFooInvoked = false; - public $postFooInvoked = false; - - /* Listener methods */ - - public function preFoo(EventInterface $e) - { - $this->preFooInvoked = true; - } - - public function postFoo(EventInterface $e) - { - $this->postFooInvoked = true; - - $e->stopPropagation(); - } - - /** - * @expectedException \PHPUnit_Framework_Error_Deprecated - */ - public function testHasDeprecatedAddListener() - { - $emitter = new Emitter(); - $emitter->addListener('foo', function () {}); - } - - /** - * @expectedException \PHPUnit_Framework_Error_Deprecated - */ - public function testHasDeprecatedAddSubscriber() - { - $emitter = new Emitter(); - $emitter->addSubscriber('foo', new TestEventSubscriber()); - } -} - -class TestWithDispatcher -{ - public $name; - - public function foo(EventInterface $e, $name) - { - $this->name = $name; - } -} - -class TestEventSubscriber extends TestEventListener implements SubscriberInterface -{ - public function getEvents() - { - return [ - 'pre.foo' => ['preFoo'], - 'post.foo' => ['postFoo'] - ]; - } -} - -class TestEventSubscriberWithPriorities extends TestEventListener implements SubscriberInterface -{ - public function getEvents() - { - return [ - 'pre.foo' => ['preFoo', 10], - 'post.foo' => ['postFoo'] - ]; - } -} - -class TestEventSubscriberWithMultiple extends TestEventListener implements SubscriberInterface -{ - public function getEvents() - { - return ['pre.foo' => [['preFoo', 10],['preFoo', 20]]]; - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/ErrorEventTest.php b/vendor/guzzlehttp/guzzle/tests/Event/ErrorEventTest.php deleted file mode 100644 index e91b7f0c..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/ErrorEventTest.php +++ /dev/null @@ -1,23 +0,0 @@ -request); - $t->exception = $except; - $e = new ErrorEvent($t); - $this->assertSame($e->getException(), $t->exception); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/HasEmitterTraitTest.php b/vendor/guzzlehttp/guzzle/tests/Event/HasEmitterTraitTest.php deleted file mode 100644 index 47099187..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/HasEmitterTraitTest.php +++ /dev/null @@ -1,27 +0,0 @@ -getMockBuilder('GuzzleHttp\Tests\Event\AbstractHasEmitter') - ->getMockForAbstractClass(); - - $result = $mock->getEmitter(); - $this->assertInstanceOf('GuzzleHttp\Event\EmitterInterface', $result); - $result2 = $mock->getEmitter(); - $this->assertSame($result, $result2); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/ListenerAttacherTraitTest.php b/vendor/guzzlehttp/guzzle/tests/Event/ListenerAttacherTraitTest.php deleted file mode 100644 index 0b5d348f..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/ListenerAttacherTraitTest.php +++ /dev/null @@ -1,92 +0,0 @@ -listeners = $this->prepareListeners($args, ['foo', 'bar']); - $this->attachListeners($this, $this->listeners); - } -} - -class ListenerAttacherTraitTest extends \PHPUnit_Framework_TestCase -{ - public function testRegistersEvents() - { - $fn = function () {}; - $o = new ObjectWithEvents([ - 'foo' => $fn, - 'bar' => $fn, - ]); - - $this->assertEquals([ - ['name' => 'foo', 'fn' => $fn, 'priority' => 0, 'once' => false], - ['name' => 'bar', 'fn' => $fn, 'priority' => 0, 'once' => false], - ], $o->listeners); - - $this->assertCount(1, $o->getEmitter()->listeners('foo')); - $this->assertCount(1, $o->getEmitter()->listeners('bar')); - } - - public function testRegistersEventsWithPriorities() - { - $fn = function () {}; - $o = new ObjectWithEvents([ - 'foo' => ['fn' => $fn, 'priority' => 99, 'once' => true], - 'bar' => ['fn' => $fn, 'priority' => 50], - ]); - - $this->assertEquals([ - ['name' => 'foo', 'fn' => $fn, 'priority' => 99, 'once' => true], - ['name' => 'bar', 'fn' => $fn, 'priority' => 50, 'once' => false], - ], $o->listeners); - } - - public function testRegistersMultipleEvents() - { - $fn = function () {}; - $eventArray = [['fn' => $fn], ['fn' => $fn]]; - $o = new ObjectWithEvents([ - 'foo' => $eventArray, - 'bar' => $eventArray, - ]); - - $this->assertEquals([ - ['name' => 'foo', 'fn' => $fn, 'priority' => 0, 'once' => false], - ['name' => 'foo', 'fn' => $fn, 'priority' => 0, 'once' => false], - ['name' => 'bar', 'fn' => $fn, 'priority' => 0, 'once' => false], - ['name' => 'bar', 'fn' => $fn, 'priority' => 0, 'once' => false], - ], $o->listeners); - - $this->assertCount(2, $o->getEmitter()->listeners('foo')); - $this->assertCount(2, $o->getEmitter()->listeners('bar')); - } - - public function testRegistersEventsWithOnce() - { - $called = 0; - $fn = function () use (&$called) { $called++; }; - $o = new ObjectWithEvents(['foo' => ['fn' => $fn, 'once' => true]]); - $ev = $this->getMock('GuzzleHttp\Event\EventInterface'); - $o->getEmitter()->emit('foo', $ev); - $o->getEmitter()->emit('foo', $ev); - $this->assertEquals(1, $called); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesEvents() - { - new ObjectWithEvents(['foo' => 'bar']); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/ProgressEventTest.php b/vendor/guzzlehttp/guzzle/tests/Event/ProgressEventTest.php deleted file mode 100644 index 664f8b6b..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/ProgressEventTest.php +++ /dev/null @@ -1,25 +0,0 @@ -assertSame($t->request, $p->getRequest()); - $this->assertSame($t->client, $p->getClient()); - $this->assertEquals(2, $p->downloadSize); - $this->assertEquals(1, $p->downloaded); - $this->assertEquals(3, $p->uploadSize); - $this->assertEquals(0, $p->uploaded); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Event/RequestEventsTest.php b/vendor/guzzlehttp/guzzle/tests/Event/RequestEventsTest.php deleted file mode 100644 index b3b96660..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Event/RequestEventsTest.php +++ /dev/null @@ -1,74 +0,0 @@ - [$cb]]], - [ - ['complete' => $cb], - ['complete'], - $cb, - ['complete' => [$cb, $cb]] - ], - [ - ['prepare' => []], - ['error', 'foo'], - $cb, - [ - 'prepare' => [], - 'error' => [$cb], - 'foo' => [$cb] - ] - ], - [ - ['prepare' => []], - ['prepare'], - $cb, - [ - 'prepare' => [$cb] - ] - ], - [ - ['prepare' => ['fn' => $cb]], - ['prepare'], $cb, - [ - 'prepare' => [ - ['fn' => $cb], - $cb - ] - ] - ], - ]; - } - - /** - * @dataProvider prepareEventProvider - */ - public function testConvertsEventArrays( - array $in, - array $events, - $add, - array $out - ) { - $result = RequestEvents::convertEventArray($in, $events, $add); - $this->assertEquals($out, $result); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesEventFormat() - { - RequestEvents::convertEventArray(['foo' => false], ['foo'], []); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Exception/ParseExceptionTest.php b/vendor/guzzlehttp/guzzle/tests/Exception/ParseExceptionTest.php deleted file mode 100644 index 4ff9bfb6..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Exception/ParseExceptionTest.php +++ /dev/null @@ -1,20 +0,0 @@ -assertSame($res, $e->getResponse()); - $this->assertEquals('foo', $e->getMessage()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Exception/RequestExceptionTest.php b/vendor/guzzlehttp/guzzle/tests/Exception/RequestExceptionTest.php deleted file mode 100644 index bea9077b..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Exception/RequestExceptionTest.php +++ /dev/null @@ -1,83 +0,0 @@ -assertSame($req, $e->getRequest()); - $this->assertSame($res, $e->getResponse()); - $this->assertTrue($e->hasResponse()); - $this->assertEquals('foo', $e->getMessage()); - } - - public function testCreatesGenerateException() - { - $e = RequestException::create(new Request('GET', '/')); - $this->assertEquals('Error completing request', $e->getMessage()); - $this->assertInstanceOf('GuzzleHttp\Exception\RequestException', $e); - } - - public function testCreatesClientErrorResponseException() - { - $e = RequestException::create(new Request('GET', '/'), new Response(400)); - $this->assertEquals( - 'Client error response [url] / [status code] 400 [reason phrase] Bad Request', - $e->getMessage() - ); - $this->assertInstanceOf('GuzzleHttp\Exception\ClientException', $e); - } - - public function testCreatesServerErrorResponseException() - { - $e = RequestException::create(new Request('GET', '/'), new Response(500)); - $this->assertEquals( - 'Server error response [url] / [status code] 500 [reason phrase] Internal Server Error', - $e->getMessage() - ); - $this->assertInstanceOf('GuzzleHttp\Exception\ServerException', $e); - } - - public function testCreatesGenericErrorResponseException() - { - $e = RequestException::create(new Request('GET', '/'), new Response(600)); - $this->assertEquals( - 'Unsuccessful response [url] / [status code] 600 [reason phrase] ', - $e->getMessage() - ); - $this->assertInstanceOf('GuzzleHttp\Exception\RequestException', $e); - } - - public function testHasStatusCodeAsExceptionCode() { - $e = RequestException::create(new Request('GET', '/'), new Response(442)); - $this->assertEquals(442, $e->getCode()); - } - - public function testWrapsRequestExceptions() - { - $e = new \Exception('foo'); - $r = new Request('GET', 'http://www.oo.com'); - $ex = RequestException::wrapException($r, $e); - $this->assertInstanceOf('GuzzleHttp\Exception\RequestException', $ex); - $this->assertSame($e, $ex->getPrevious()); - } - - public function testWrapsConnectExceptions() - { - $e = new ConnectException('foo'); - $r = new Request('GET', 'http://www.oo.com'); - $ex = RequestException::wrapException($r, $e); - $this->assertInstanceOf('GuzzleHttp\Exception\ConnectException', $ex); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Exception/XmlParseExceptionTest.php b/vendor/guzzlehttp/guzzle/tests/Exception/XmlParseExceptionTest.php deleted file mode 100644 index 51b97425..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Exception/XmlParseExceptionTest.php +++ /dev/null @@ -1,19 +0,0 @@ -assertSame($error, $e->getError()); - $this->assertEquals('foo', $e->getMessage()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/IntegrationTest.php b/vendor/guzzlehttp/guzzle/tests/IntegrationTest.php deleted file mode 100644 index e26c64d9..00000000 --- a/vendor/guzzlehttp/guzzle/tests/IntegrationTest.php +++ /dev/null @@ -1,123 +0,0 @@ -createRequest( - 'GET', - Server::$url, - [ - 'timeout' => 1, - 'connect_timeout' => 1, - 'proxy' => 'http://127.0.0.1:123/foo' - ] - ); - - $events = []; - $fn = function(AbstractTransferEvent $event) use (&$events) { - $events[] = [ - get_class($event), - $event->hasResponse(), - $event->getResponse() - ]; - }; - - $pool = new Pool($c, [$r], [ - 'error' => $fn, - 'end' => $fn - ]); - - $pool->wait(); - - $this->assertCount(2, $events); - $this->assertEquals('GuzzleHttp\Event\ErrorEvent', $events[0][0]); - $this->assertFalse($events[0][1]); - $this->assertNull($events[0][2]); - - $this->assertEquals('GuzzleHttp\Event\EndEvent', $events[1][0]); - $this->assertFalse($events[1][1]); - $this->assertNull($events[1][2]); - } - - /** - * @issue https://github.com/guzzle/guzzle/issues/866 - */ - public function testProperyGetsTransferStats() - { - $transfer = []; - Server::enqueue([new Response(200)]); - $c = new Client(); - $response = $c->get(Server::$url . '/foo', [ - 'events' => [ - 'end' => function (EndEvent $e) use (&$transfer) { - $transfer = $e->getTransferInfo(); - } - ] - ]); - $this->assertEquals(Server::$url . '/foo', $response->getEffectiveUrl()); - $this->assertNotEmpty($transfer); - $this->assertArrayHasKey('url', $transfer); - } - - public function testNestedFutureResponsesAreResolvedWhenSending() - { - $c = new Client(); - $total = 3; - Server::enqueue([ - new Response(200), - new Response(201), - new Response(202) - ]); - $c->getEmitter()->on( - 'complete', - function (CompleteEvent $e) use (&$total) { - if (--$total) { - $e->retry(); - } - } - ); - $response = $c->get(Server::$url); - $this->assertEquals(202, $response->getStatusCode()); - $this->assertEquals('GuzzleHttp\Message\Response', get_class($response)); - } - - public function testNestedFutureErrorsAreResolvedWhenSending() - { - $c = new Client(); - $total = 3; - Server::enqueue([ - new Response(500), - new Response(501), - new Response(502) - ]); - $c->getEmitter()->on( - 'error', - function (ErrorEvent $e) use (&$total) { - if (--$total) { - $e->retry(); - } - } - ); - try { - $c->get(Server::$url); - $this->fail('Did not throw!'); - } catch (RequestException $e) { - $this->assertEquals(502, $e->getResponse()->getStatusCode()); - } - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Message/AbstractMessageTest.php b/vendor/guzzlehttp/guzzle/tests/Message/AbstractMessageTest.php deleted file mode 100644 index f02a576f..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Message/AbstractMessageTest.php +++ /dev/null @@ -1,269 +0,0 @@ -assertEquals(1.1, $m->getProtocolVersion()); - } - - public function testHasHeaders() - { - $m = new Request('GET', 'http://foo.com'); - $this->assertFalse($m->hasHeader('foo')); - $m->addHeader('foo', 'bar'); - $this->assertTrue($m->hasHeader('foo')); - } - - public function testInitializesMessageWithProtocolVersionOption() - { - $m = new Request('GET', '/', [], null, [ - 'protocol_version' => '10' - ]); - $this->assertEquals(10, $m->getProtocolVersion()); - } - - public function testHasBody() - { - $m = new Request('GET', 'http://foo.com'); - $this->assertNull($m->getBody()); - $s = Stream::factory('test'); - $m->setBody($s); - $this->assertSame($s, $m->getBody()); - $this->assertFalse($m->hasHeader('Content-Length')); - } - - public function testCanRemoveBodyBySettingToNullAndRemovesCommonBodyHeaders() - { - $m = new Request('GET', 'http://foo.com'); - $m->setBody(Stream::factory('foo')); - $m->setHeader('Content-Length', 3); - $m->setHeader('Transfer-Encoding', 'chunked'); - $m->setBody(null); - $this->assertNull($m->getBody()); - $this->assertFalse($m->hasHeader('Content-Length')); - $this->assertFalse($m->hasHeader('Transfer-Encoding')); - } - - public function testCastsToString() - { - $m = new Request('GET', 'http://foo.com'); - $m->setHeader('foo', 'bar'); - $m->setBody(Stream::factory('baz')); - $this->assertEquals("GET / HTTP/1.1\r\nHost: foo.com\r\nfoo: bar\r\n\r\nbaz", (string) $m); - } - - public function parseParamsProvider() - { - $res1 = array( - array( - '', - 'rel' => 'front', - 'type' => 'image/jpeg', - ), - array( - '', - 'rel' => 'back', - 'type' => 'image/jpeg', - ), - ); - - return array( - array( - '; rel="front"; type="image/jpeg", ; rel=back; type="image/jpeg"', - $res1 - ), - array( - '; rel="front"; type="image/jpeg",; rel=back; type="image/jpeg"', - $res1 - ), - array( - 'foo="baz"; bar=123, boo, test="123", foobar="foo;bar"', - array( - array('foo' => 'baz', 'bar' => '123'), - array('boo'), - array('test' => '123'), - array('foobar' => 'foo;bar') - ) - ), - array( - '; rel="side"; type="image/jpeg",; rel=side; type="image/jpeg"', - array( - array('', 'rel' => 'side', 'type' => 'image/jpeg'), - array('', 'rel' => 'side', 'type' => 'image/jpeg') - ) - ), - array( - '', - array() - ) - ); - } - - /** - * @dataProvider parseParamsProvider - */ - public function testParseParams($header, $result) - { - $request = new Request('GET', '/', ['foo' => $header]); - $this->assertEquals($result, Request::parseHeader($request, 'foo')); - } - - public function testAddsHeadersWhenNotPresent() - { - $h = new Request('GET', 'http://foo.com'); - $h->addHeader('foo', 'bar'); - $this->assertInternalType('string', $h->getHeader('foo')); - $this->assertEquals('bar', $h->getHeader('foo')); - } - - public function testAddsHeadersWhenPresentSameCase() - { - $h = new Request('GET', 'http://foo.com'); - $h->addHeader('foo', 'bar'); - $h->addHeader('foo', 'baz'); - $this->assertEquals('bar, baz', $h->getHeader('foo')); - $this->assertEquals(['bar', 'baz'], $h->getHeaderAsArray('foo')); - } - - public function testAddsMultipleHeaders() - { - $h = new Request('GET', 'http://foo.com'); - $h->addHeaders([ - 'foo' => ' bar', - 'baz' => [' bam ', 'boo'] - ]); - $this->assertEquals([ - 'foo' => ['bar'], - 'baz' => ['bam', 'boo'], - 'Host' => ['foo.com'] - ], $h->getHeaders()); - } - - public function testAddsHeadersWhenPresentDifferentCase() - { - $h = new Request('GET', 'http://foo.com'); - $h->addHeader('Foo', 'bar'); - $h->addHeader('fOO', 'baz'); - $this->assertEquals('bar, baz', $h->getHeader('foo')); - } - - public function testAddsHeadersWithArray() - { - $h = new Request('GET', 'http://foo.com'); - $h->addHeader('Foo', ['bar', 'baz']); - $this->assertEquals('bar, baz', $h->getHeader('foo')); - } - - public function testGetHeadersReturnsAnArrayOfOverTheWireHeaderValues() - { - $h = new Request('GET', 'http://foo.com'); - $h->addHeader('foo', 'bar'); - $h->addHeader('Foo', 'baz'); - $h->addHeader('boO', 'test'); - $result = $h->getHeaders(); - $this->assertInternalType('array', $result); - $this->assertArrayHasKey('Foo', $result); - $this->assertArrayNotHasKey('foo', $result); - $this->assertArrayHasKey('boO', $result); - $this->assertEquals(['bar', 'baz'], $result['Foo']); - $this->assertEquals(['test'], $result['boO']); - } - - public function testSetHeaderOverwritesExistingValues() - { - $h = new Request('GET', 'http://foo.com'); - $h->setHeader('foo', 'bar'); - $this->assertEquals('bar', $h->getHeader('foo')); - $h->setHeader('Foo', 'baz'); - $this->assertEquals('baz', $h->getHeader('foo')); - $this->assertArrayHasKey('Foo', $h->getHeaders()); - } - - public function testSetHeaderOverwritesExistingValuesUsingHeaderArray() - { - $h = new Request('GET', 'http://foo.com'); - $h->setHeader('foo', ['bar']); - $this->assertEquals('bar', $h->getHeader('foo')); - } - - public function testSetHeaderOverwritesExistingValuesUsingArray() - { - $h = new Request('GET', 'http://foo.com'); - $h->setHeader('foo', ['bar']); - $this->assertEquals('bar', $h->getHeader('foo')); - } - - public function testSetHeadersOverwritesAllHeaders() - { - $h = new Request('GET', 'http://foo.com'); - $h->setHeader('foo', 'bar'); - $h->setHeaders(['foo' => 'a', 'boo' => 'b']); - $this->assertEquals(['foo' => ['a'], 'boo' => ['b']], $h->getHeaders()); - } - - public function testChecksIfCaseInsensitiveHeaderIsPresent() - { - $h = new Request('GET', 'http://foo.com'); - $h->setHeader('foo', 'bar'); - $this->assertTrue($h->hasHeader('foo')); - $this->assertTrue($h->hasHeader('Foo')); - $h->setHeader('fOo', 'bar'); - $this->assertTrue($h->hasHeader('Foo')); - } - - public function testRemovesHeaders() - { - $h = new Request('GET', 'http://foo.com'); - $h->setHeader('foo', 'bar'); - $h->removeHeader('foo'); - $this->assertFalse($h->hasHeader('foo')); - $h->setHeader('Foo', 'bar'); - $h->removeHeader('FOO'); - $this->assertFalse($h->hasHeader('foo')); - } - - public function testReturnsCorrectTypeWhenMissing() - { - $h = new Request('GET', 'http://foo.com'); - $this->assertInternalType('string', $h->getHeader('foo')); - $this->assertInternalType('array', $h->getHeaderAsArray('foo')); - } - - public function testSetsIntegersAndFloatsAsHeaders() - { - $h = new Request('GET', 'http://foo.com'); - $h->setHeader('foo', 10); - $h->setHeader('bar', 10.5); - $h->addHeader('foo', 10); - $h->addHeader('bar', 10.5); - $this->assertSame('10, 10', $h->getHeader('foo')); - $this->assertSame('10.5, 10.5', $h->getHeader('bar')); - } - - public function testGetsResponseStartLine() - { - $m = new Response(200); - $this->assertEquals('HTTP/1.1 200 OK', Response::getStartLine($m)); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testThrowsWhenMessageIsUnknown() - { - $m = $this->getMockBuilder('GuzzleHttp\Message\AbstractMessage') - ->getMockForAbstractClass(); - AbstractMessage::getStartLine($m); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Message/FutureResponseTest.php b/vendor/guzzlehttp/guzzle/tests/Message/FutureResponseTest.php deleted file mode 100644 index 771631d5..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Message/FutureResponseTest.php +++ /dev/null @@ -1,160 +0,0 @@ -foo; - } - - public function testDoesTheSameAsResponseWhenDereferenced() - { - $str = Stream::factory('foo'); - $response = new Response(200, ['Foo' => 'bar'], $str); - $future = MockTest::createFuture(function () use ($response) { - return $response; - }); - $this->assertFalse($this->readAttribute($future, 'isRealized')); - $this->assertEquals(200, $future->getStatusCode()); - $this->assertTrue($this->readAttribute($future, 'isRealized')); - // Deref again does nothing. - $future->wait(); - $this->assertTrue($this->readAttribute($future, 'isRealized')); - $this->assertEquals('bar', $future->getHeader('Foo')); - $this->assertEquals(['bar'], $future->getHeaderAsarray('Foo')); - $this->assertSame($response->getHeaders(), $future->getHeaders()); - $this->assertSame( - $response->getBody(), - $future->getBody() - ); - $this->assertSame( - $response->getProtocolVersion(), - $future->getProtocolVersion() - ); - $this->assertSame( - $response->getEffectiveUrl(), - $future->getEffectiveUrl() - ); - $future->setEffectiveUrl('foo'); - $this->assertEquals('foo', $response->getEffectiveUrl()); - $this->assertSame( - $response->getReasonPhrase(), - $future->getReasonPhrase() - ); - - $this->assertTrue($future->hasHeader('foo')); - - $future->removeHeader('Foo'); - $this->assertFalse($future->hasHeader('foo')); - $this->assertFalse($response->hasHeader('foo')); - - $future->setBody(Stream::factory('true')); - $this->assertEquals('true', (string) $response->getBody()); - $this->assertTrue($future->json()); - $this->assertSame((string) $response, (string) $future); - - $future->setBody(Stream::factory('c')); - $this->assertEquals('c', (string) $future->xml()->b); - - $future->addHeader('a', 'b'); - $this->assertEquals('b', $future->getHeader('a')); - - $future->addHeaders(['a' => '2']); - $this->assertEquals('b, 2', $future->getHeader('a')); - - $future->setHeader('a', '2'); - $this->assertEquals('2', $future->getHeader('a')); - - $future->setHeaders(['a' => '3']); - $this->assertEquals(['a' => ['3']], $future->getHeaders()); - } - - public function testCanDereferenceManually() - { - $response = new Response(200, ['Foo' => 'bar']); - $future = MockTest::createFuture(function () use ($response) { - return $response; - }); - $this->assertSame($response, $future->wait()); - $this->assertTrue($this->readAttribute($future, 'isRealized')); - } - - public function testCanCancel() - { - $c = false; - $deferred = new Deferred(); - $future = new FutureResponse( - $deferred->promise(), - function () {}, - function () use (&$c) { - $c = true; - return true; - } - ); - - $this->assertFalse($this->readAttribute($future, 'isRealized')); - $future->cancel(); - $this->assertTrue($this->readAttribute($future, 'isRealized')); - $future->cancel(); - } - - public function testCanCancelButReturnsFalseForNoCancelFunction() - { - $future = MockTest::createFuture(function () {}); - $future->cancel(); - $this->assertTrue($this->readAttribute($future, 'isRealized')); - } - - /** - * @expectedException \GuzzleHttp\Ring\Exception\CancelledFutureAccessException - */ - public function testAccessingCancelledResponseThrows() - { - $future = MockTest::createFuture(function () {}); - $future->cancel(); - $future->getStatusCode(); - } - - public function testExceptionInToStringTriggersError() - { - $future = MockTest::createFuture(function () { - throw new \Exception('foo'); - }); - $err = ''; - set_error_handler(function () use (&$err) { - $err = func_get_args()[1]; - }); - echo $future; - restore_error_handler(); - $this->assertContains('foo', $err); - } - - public function testProxiesSetters() - { - $str = Stream::factory('foo'); - $response = new Response(200, ['Foo' => 'bar'], $str); - $future = MockTest::createFuture(function () use ($response) { - return $response; - }); - - $future->setStatusCode(202); - $this->assertEquals(202, $future->getStatusCode()); - $this->assertEquals(202, $response->getStatusCode()); - - $future->setReasonPhrase('foo'); - $this->assertEquals('foo', $future->getReasonPhrase()); - $this->assertEquals('foo', $response->getReasonPhrase()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Message/MessageFactoryTest.php b/vendor/guzzlehttp/guzzle/tests/Message/MessageFactoryTest.php deleted file mode 100644 index 390f0103..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Message/MessageFactoryTest.php +++ /dev/null @@ -1,601 +0,0 @@ -createResponse(200, ['foo' => 'bar'], 'test', [ - 'protocol_version' => 1.0 - ]); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals(['foo' => ['bar']], $response->getHeaders()); - $this->assertEquals('test', $response->getBody()); - $this->assertEquals(1.0, $response->getProtocolVersion()); - } - - public function testCreatesRequestFromMessage() - { - $f = new MessageFactory(); - $req = $f->fromMessage("GET / HTTP/1.1\r\nBaz: foo\r\n\r\n"); - $this->assertEquals('GET', $req->getMethod()); - $this->assertEquals('/', $req->getPath()); - $this->assertEquals('foo', $req->getHeader('Baz')); - $this->assertNull($req->getBody()); - } - - public function testCreatesRequestFromMessageWithBody() - { - $req = (new MessageFactory())->fromMessage("GET / HTTP/1.1\r\nBaz: foo\r\n\r\ntest"); - $this->assertEquals('test', $req->getBody()); - } - - public function testCreatesRequestWithPostBody() - { - $req = (new MessageFactory())->createRequest('GET', 'http://www.foo.com', ['body' => ['abc' => '123']]); - $this->assertEquals('abc=123', $req->getBody()); - } - - public function testCreatesRequestWithPostBodyScalars() - { - $req = (new MessageFactory())->createRequest( - 'GET', - 'http://www.foo.com', - ['body' => [ - 'abc' => true, - '123' => false, - 'foo' => null, - 'baz' => 10, - 'bam' => 1.5, - 'boo' => [1]] - ] - ); - $this->assertEquals( - 'abc=1&123=&foo&baz=10&bam=1.5&boo%5B0%5D=1', - (string) $req->getBody() - ); - } - - public function testCreatesRequestWithPostBodyAndPostFiles() - { - $pf = fopen(__FILE__, 'r'); - $pfi = new PostFile('ghi', 'abc', __FILE__); - $req = (new MessageFactory())->createRequest('GET', 'http://www.foo.com', [ - 'body' => [ - 'abc' => '123', - 'def' => $pf, - 'ghi' => $pfi - ] - ]); - $this->assertInstanceOf('GuzzleHttp\Post\PostBody', $req->getBody()); - $s = (string) $req; - $this->assertContains('testCreatesRequestWithPostBodyAndPostFiles', $s); - $this->assertContains('multipart/form-data', $s); - $this->assertTrue(in_array($pfi, $req->getBody()->getFiles(), true)); - } - - public function testCreatesResponseFromMessage() - { - $response = (new MessageFactory())->fromMessage("HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\ntest"); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('OK', $response->getReasonPhrase()); - $this->assertEquals('4', $response->getHeader('Content-Length')); - $this->assertEquals('test', $response->getBody(true)); - } - - public function testCanCreateHeadResponses() - { - $response = (new MessageFactory())->fromMessage("HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\n"); - $this->assertEquals(200, $response->getStatusCode()); - $this->assertEquals('OK', $response->getReasonPhrase()); - $this->assertEquals(null, $response->getBody()); - $this->assertEquals('4', $response->getHeader('Content-Length')); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testFactoryRequiresMessageForRequest() - { - (new MessageFactory())->fromMessage(''); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage foo - */ - public function testValidatesOptionsAreImplemented() - { - (new MessageFactory())->createRequest('GET', 'http://test.com', ['foo' => 'bar']); - } - - public function testOptionsAddsRequestOptions() - { - $request = (new MessageFactory())->createRequest( - 'GET', 'http://test.com', ['config' => ['baz' => 'bar']] - ); - $this->assertEquals('bar', $request->getConfig()->get('baz')); - } - - public function testCanDisableRedirects() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['allow_redirects' => false]); - $this->assertEmpty($request->getEmitter()->listeners('complete')); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesRedirects() - { - (new MessageFactory())->createRequest('GET', '/', ['allow_redirects' => 'foo']); - } - - public function testCanEnableStrictRedirectsAndSpecifyMax() - { - $request = (new MessageFactory())->createRequest('GET', '/', [ - 'allow_redirects' => ['max' => 10, 'strict' => true] - ]); - $this->assertTrue($request->getConfig()['redirect']['strict']); - $this->assertEquals(10, $request->getConfig()['redirect']['max']); - } - - public function testCanAddCookiesFromHash() - { - $request = (new MessageFactory())->createRequest('GET', 'http://www.test.com/', [ - 'cookies' => ['Foo' => 'Bar'] - ]); - $cookies = null; - foreach ($request->getEmitter()->listeners('before') as $l) { - if ($l[0] instanceof Cookie) { - $cookies = $l[0]; - break; - } - } - if (!$cookies) { - $this->fail('Did not add cookie listener'); - } else { - $this->assertCount(1, $cookies->getCookieJar()); - } - } - - public function testAddsCookieUsingTrue() - { - $factory = new MessageFactory(); - $request1 = $factory->createRequest('GET', '/', ['cookies' => true]); - $request2 = $factory->createRequest('GET', '/', ['cookies' => true]); - $listeners = function ($r) { - return array_filter($r->getEmitter()->listeners('before'), function ($l) { - return $l[0] instanceof Cookie; - }); - }; - $this->assertSame($listeners($request1), $listeners($request2)); - } - - public function testAddsCookieFromCookieJar() - { - $jar = new CookieJar(); - $request = (new MessageFactory())->createRequest('GET', '/', ['cookies' => $jar]); - foreach ($request->getEmitter()->listeners('before') as $l) { - if ($l[0] instanceof Cookie) { - $this->assertSame($jar, $l[0]->getCookieJar()); - } - } - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesCookies() - { - (new MessageFactory())->createRequest('GET', '/', ['cookies' => 'baz']); - } - - public function testCanAddQuery() - { - $request = (new MessageFactory())->createRequest('GET', 'http://foo.com', [ - 'query' => ['Foo' => 'Bar'] - ]); - $this->assertEquals('Bar', $request->getQuery()->get('Foo')); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesQuery() - { - (new MessageFactory())->createRequest('GET', 'http://foo.com', [ - 'query' => 'foo' - ]); - } - - public function testCanSetDefaultQuery() - { - $request = (new MessageFactory())->createRequest('GET', 'http://foo.com?test=abc', [ - 'query' => ['Foo' => 'Bar', 'test' => 'def'] - ]); - $this->assertEquals('Bar', $request->getQuery()->get('Foo')); - $this->assertEquals('abc', $request->getQuery()->get('test')); - } - - public function testCanSetDefaultQueryWithObject() - { - $request = (new MessageFactory)->createRequest( - 'GET', - 'http://foo.com?test=abc', [ - 'query' => new Query(['Foo' => 'Bar', 'test' => 'def']) - ] - ); - $this->assertEquals('Bar', $request->getQuery()->get('Foo')); - $this->assertEquals('abc', $request->getQuery()->get('test')); - } - - public function testCanAddBasicAuth() - { - $request = (new MessageFactory())->createRequest('GET', 'http://foo.com', [ - 'auth' => ['michael', 'test'] - ]); - $this->assertTrue($request->hasHeader('Authorization')); - } - - public function testCanAddDigestAuth() - { - $request = (new MessageFactory())->createRequest('GET', 'http://foo.com', [ - 'auth' => ['michael', 'test', 'digest'] - ]); - $this->assertEquals('michael:test', $request->getConfig()->getPath('curl/' . CURLOPT_USERPWD)); - $this->assertEquals(CURLAUTH_DIGEST, $request->getConfig()->getPath('curl/' . CURLOPT_HTTPAUTH)); - } - - public function testCanDisableAuth() - { - $request = (new MessageFactory())->createRequest('GET', 'http://foo.com', [ - 'auth' => false - ]); - $this->assertFalse($request->hasHeader('Authorization')); - } - - public function testCanSetCustomAuth() - { - $request = (new MessageFactory())->createRequest('GET', 'http://foo.com', [ - 'auth' => 'foo' - ]); - $this->assertEquals('foo', $request->getConfig()['auth']); - } - - public function testCanAddEvents() - { - $foo = null; - $client = new Client(); - $client->getEmitter()->attach(new Mock([new Response(200)])); - $client->get('http://test.com', [ - 'events' => [ - 'before' => function () use (&$foo) { $foo = true; } - ] - ]); - $this->assertTrue($foo); - } - - public function testCanAddEventsWithPriority() - { - $foo = null; - $client = new Client(); - $client->getEmitter()->attach(new Mock(array(new Response(200)))); - $request = $client->createRequest('GET', 'http://test.com', [ - 'events' => [ - 'before' => [ - 'fn' => function () use (&$foo) { $foo = true; }, - 'priority' => 123 - ] - ] - ]); - $client->send($request); - $this->assertTrue($foo); - $l = $this->readAttribute($request->getEmitter(), 'listeners'); - $this->assertArrayHasKey(123, $l['before']); - } - - public function testCanAddEventsOnce() - { - $foo = 0; - $client = new Client(); - $client->getEmitter()->attach(new Mock([ - new Response(200), - new Response(200), - ])); - $fn = function () use (&$foo) { ++$foo; }; - $request = $client->createRequest('GET', 'http://test.com', [ - 'events' => ['before' => ['fn' => $fn, 'once' => true]] - ]); - $client->send($request); - $this->assertEquals(1, $foo); - $client->send($request); - $this->assertEquals(1, $foo); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesEventContainsFn() - { - $client = new Client(['base_url' => 'http://test.com']); - $client->createRequest('GET', '/', ['events' => ['before' => ['foo' => 'bar']]]); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesEventIsArray() - { - $client = new Client(['base_url' => 'http://test.com']); - $client->createRequest('GET', '/', ['events' => ['before' => '123']]); - } - - public function testCanAddSubscribers() - { - $mock = new Mock([new Response(200)]); - $client = new Client(); - $client->getEmitter()->attach($mock); - $client->get('http://test.com', ['subscribers' => [$mock]]); - } - - public function testCanDisableExceptions() - { - $client = new Client(); - $this->assertEquals(500, $client->get('http://test.com', [ - 'subscribers' => [new Mock([new Response(500)])], - 'exceptions' => false - ])->getStatusCode()); - } - - public function testCanChangeSaveToLocation() - { - $saveTo = Stream::factory(); - $request = (new MessageFactory())->createRequest('GET', '/', ['save_to' => $saveTo]); - $this->assertSame($saveTo, $request->getConfig()->get('save_to')); - } - - public function testCanSetProxy() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['proxy' => '192.168.16.121']); - $this->assertEquals('192.168.16.121', $request->getConfig()->get('proxy')); - } - - public function testCanSetHeadersOption() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['headers' => ['Foo' => 'Bar']]); - $this->assertEquals('Bar', (string) $request->getHeader('Foo')); - } - - public function testCanSetHeaders() - { - $request = (new MessageFactory())->createRequest('GET', '/', [ - 'headers' => ['Foo' => ['Baz', 'Bar'], 'Test' => '123'] - ]); - $this->assertEquals('Baz, Bar', $request->getHeader('Foo')); - $this->assertEquals('123', $request->getHeader('Test')); - } - - public function testCanSetTimeoutOption() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['timeout' => 1.5]); - $this->assertEquals(1.5, $request->getConfig()->get('timeout')); - } - - public function testCanSetConnectTimeoutOption() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['connect_timeout' => 1.5]); - $this->assertEquals(1.5, $request->getConfig()->get('connect_timeout')); - } - - public function testCanSetDebug() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['debug' => true]); - $this->assertTrue($request->getConfig()->get('debug')); - } - - public function testCanSetVerifyToOff() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['verify' => false]); - $this->assertFalse($request->getConfig()->get('verify')); - } - - public function testCanSetVerifyToOn() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['verify' => true]); - $this->assertTrue($request->getConfig()->get('verify')); - } - - public function testCanSetVerifyToPath() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['verify' => '/foo.pem']); - $this->assertEquals('/foo.pem', $request->getConfig()->get('verify')); - } - - public function inputValidation() - { - return array_map(function ($option) { return array($option); }, array( - 'headers', 'events', 'subscribers', 'params' - )); - } - - /** - * @dataProvider inputValidation - * @expectedException \InvalidArgumentException - */ - public function testValidatesInput($option) - { - (new MessageFactory())->createRequest('GET', '/', [$option => 'foo']); - } - - public function testCanAddSslKey() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['ssl_key' => '/foo.pem']); - $this->assertEquals('/foo.pem', $request->getConfig()->get('ssl_key')); - } - - public function testCanAddSslKeyPassword() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['ssl_key' => ['/foo.pem', 'bar']]); - $this->assertEquals(['/foo.pem', 'bar'], $request->getConfig()->get('ssl_key')); - } - - public function testCanAddSslCert() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['cert' => '/foo.pem']); - $this->assertEquals('/foo.pem', $request->getConfig()->get('cert')); - } - - public function testCanAddSslCertPassword() - { - $request = (new MessageFactory())->createRequest('GET', '/', ['cert' => ['/foo.pem', 'bar']]); - $this->assertEquals(['/foo.pem', 'bar'], $request->getConfig()->get('cert')); - } - - public function testCreatesBodyWithoutZeroString() - { - $request = (new MessageFactory())->createRequest('PUT', 'http://test.com', ['body' => '0']); - $this->assertSame('0', (string) $request->getBody()); - } - - public function testCanSetProtocolVersion() - { - $request = (new MessageFactory())->createRequest('GET', 'http://t.com', ['version' => 1.0]); - $this->assertEquals(1.0, $request->getProtocolVersion()); - } - - public function testCanAddJsonData() - { - $request = (new MessageFactory())->createRequest('PUT', 'http://f.com', [ - 'json' => ['foo' => 'bar'] - ]); - $this->assertEquals( - 'application/json', - $request->getHeader('Content-Type') - ); - $this->assertEquals('{"foo":"bar"}', (string) $request->getBody()); - } - - public function testCanAddJsonDataToAPostRequest() - { - $request = (new MessageFactory())->createRequest('POST', 'http://f.com', [ - 'json' => ['foo' => 'bar'] - ]); - $this->assertEquals( - 'application/json', - $request->getHeader('Content-Type') - ); - $this->assertEquals('{"foo":"bar"}', (string) $request->getBody()); - } - - public function testCanAddJsonDataAndNotOverwriteContentType() - { - $request = (new MessageFactory())->createRequest('PUT', 'http://f.com', [ - 'headers' => ['Content-Type' => 'foo'], - 'json' => null - ]); - $this->assertEquals('foo', $request->getHeader('Content-Type')); - $this->assertEquals('null', (string) $request->getBody()); - } - - public function testCanUseCustomRequestOptions() - { - $c = false; - $f = new MessageFactory([ - 'foo' => function (RequestInterface $request, $value) use (&$c) { - $c = true; - $this->assertEquals('bar', $value); - } - ]); - - $f->createRequest('PUT', 'http://f.com', [ - 'headers' => ['Content-Type' => 'foo'], - 'foo' => 'bar' - ]); - - $this->assertTrue($c); - } - - /** - * @ticket https://github.com/guzzle/guzzle/issues/706 - */ - public function testDoesNotApplyPostBodyRightAway() - { - $request = (new MessageFactory())->createRequest('POST', 'http://f.cn', [ - 'body' => ['foo' => ['bar', 'baz']] - ]); - $this->assertEquals('', $request->getHeader('Content-Type')); - $this->assertEquals('', $request->getHeader('Content-Length')); - $request->getBody()->setAggregator(Query::duplicateAggregator()); - $request->getBody()->applyRequestHeaders($request); - $this->assertEquals('foo=bar&foo=baz', $request->getBody()); - } - - public function testCanForceMultipartUploadWithContentType() - { - $client = new Client(); - $client->getEmitter()->attach(new Mock([new Response(200)])); - $history = new History(); - $client->getEmitter()->attach($history); - $client->post('http://foo.com', [ - 'headers' => ['Content-Type' => 'multipart/form-data'], - 'body' => ['foo' => 'bar'] - ]); - $this->assertContains( - 'multipart/form-data; boundary=', - $history->getLastRequest()->getHeader('Content-Type') - ); - $this->assertContains( - "Content-Disposition: form-data; name=\"foo\"\r\n\r\nbar", - (string) $history->getLastRequest()->getBody() - ); - } - - public function testDecodeDoesNotForceAcceptHeader() - { - $request = (new MessageFactory())->createRequest('POST', 'http://f.cn', [ - 'decode_content' => true - ]); - $this->assertEquals('', $request->getHeader('Accept-Encoding')); - $this->assertTrue($request->getConfig()->get('decode_content')); - } - - public function testDecodeCanAddAcceptHeader() - { - $request = (new MessageFactory())->createRequest('POST', 'http://f.cn', [ - 'decode_content' => 'gzip' - ]); - $this->assertEquals('gzip', $request->getHeader('Accept-Encoding')); - $this->assertTrue($request->getConfig()->get('decode_content')); - } - - public function testCanDisableDecoding() - { - $request = (new MessageFactory())->createRequest('POST', 'http://f.cn', [ - 'decode_content' => false - ]); - $this->assertEquals('', $request->getHeader('Accept-Encoding')); - $this->assertNull($request->getConfig()->get('decode_content')); - } -} - -class ExtendedFactory extends MessageFactory -{ - protected function add_foo() {} -} diff --git a/vendor/guzzlehttp/guzzle/tests/Message/MessageParserTest.php b/vendor/guzzlehttp/guzzle/tests/Message/MessageParserTest.php deleted file mode 100644 index 0bcc9430..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Message/MessageParserTest.php +++ /dev/null @@ -1,276 +0,0 @@ -compareRequestResults($parts, $parser->parseRequest($message)); - } - - /** - * @dataProvider responseProvider - */ - public function testParsesResponses($message, $parts) - { - $parser = new MessageParser(); - $this->compareResponseResults($parts, $parser->parseResponse($message)); - } - - public function testParsesRequestsWithMissingProtocol() - { - $parser = new MessageParser(); - $parts = $parser->parseRequest("GET /\r\nHost: Foo.com\r\n\r\n"); - $this->assertEquals('GET', $parts['method']); - $this->assertEquals('HTTP', $parts['protocol']); - $this->assertEquals('1.1', $parts['protocol_version']); - } - - public function testParsesRequestsWithMissingVersion() - { - $parser = new MessageParser(); - $parts = $parser->parseRequest("GET / HTTP\r\nHost: Foo.com\r\n\r\n"); - $this->assertEquals('GET', $parts['method']); - $this->assertEquals('HTTP', $parts['protocol']); - $this->assertEquals('1.1', $parts['protocol_version']); - } - - public function testParsesResponsesWithMissingReasonPhrase() - { - $parser = new MessageParser(); - $parts = $parser->parseResponse("HTTP/1.1 200\r\n\r\n"); - $this->assertEquals('200', $parts['code']); - $this->assertEquals('', $parts['reason_phrase']); - $this->assertEquals('HTTP', $parts['protocol']); - $this->assertEquals('1.1', $parts['protocol_version']); - } - - public function requestProvider() - { - $auth = base64_encode('michael:foo'); - - return array( - - // Empty request - array('', false), - - // Converts casing of request. Does not require host header. - array("GET / HTTP/1.1\r\n\r\n", array( - 'method' => 'GET', - 'protocol' => 'HTTP', - 'protocol_version' => '1.1', - 'request_url' => array( - 'scheme' => 'http', - 'host' => '', - 'port' => '', - 'path' => '/', - 'query' => '' - ), - 'headers' => array(), - 'body' => '' - )), - // Path and query string, multiple header values per header and case sensitive storage - array("HEAD /path?query=foo HTTP/1.0\r\nHost: example.com\r\nX-Foo: foo\r\nx-foo: Bar\r\nX-Foo: foo\r\nX-Foo: Baz\r\n\r\n", array( - 'method' => 'HEAD', - 'protocol' => 'HTTP', - 'protocol_version' => '1.0', - 'request_url' => array( - 'scheme' => 'http', - 'host' => 'example.com', - 'port' => '', - 'path' => '/path', - 'query' => 'query=foo' - ), - 'headers' => array( - 'Host' => 'example.com', - 'X-Foo' => array('foo', 'foo', 'Baz'), - 'x-foo' => 'Bar' - ), - 'body' => '' - )), - // Includes a body - array("PUT / HTTP/1.0\r\nhost: example.com:443\r\nContent-Length: 4\r\n\r\ntest", array( - 'method' => 'PUT', - 'protocol' => 'HTTP', - 'protocol_version' => '1.0', - 'request_url' => array( - 'scheme' => 'https', - 'host' => 'example.com', - 'port' => '443', - 'path' => '/', - 'query' => '' - ), - 'headers' => array( - 'host' => 'example.com:443', - 'Content-Length' => '4' - ), - 'body' => 'test' - )), - // Includes Authorization headers - array("GET / HTTP/1.1\r\nHost: example.com:8080\r\nAuthorization: Basic {$auth}\r\n\r\n", array( - 'method' => 'GET', - 'protocol' => 'HTTP', - 'protocol_version' => '1.1', - 'request_url' => array( - 'scheme' => 'http', - 'host' => 'example.com', - 'port' => '8080', - 'path' => '/', - 'query' => '' - ), - 'headers' => array( - 'Host' => 'example.com:8080', - 'Authorization' => "Basic {$auth}" - ), - 'body' => '' - )), - // Include authorization header - array("GET / HTTP/1.1\r\nHost: example.com:8080\r\nauthorization: Basic {$auth}\r\n\r\n", array( - 'method' => 'GET', - 'protocol' => 'HTTP', - 'protocol_version' => '1.1', - 'request_url' => array( - 'scheme' => 'http', - 'host' => 'example.com', - 'port' => '8080', - 'path' => '/', - 'query' => '' - ), - 'headers' => array( - 'Host' => 'example.com:8080', - 'authorization' => "Basic {$auth}" - ), - 'body' => '' - )), - ); - } - - public function responseProvider() - { - return array( - // Empty request - array('', false), - - array("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", array( - 'protocol' => 'HTTP', - 'protocol_version' => '1.1', - 'code' => '200', - 'reason_phrase' => 'OK', - 'headers' => array( - 'Content-Length' => 0 - ), - 'body' => '' - )), - array("HTTP/1.0 400 Bad Request\r\nContent-Length: 0\r\n\r\n", array( - 'protocol' => 'HTTP', - 'protocol_version' => '1.0', - 'code' => '400', - 'reason_phrase' => 'Bad Request', - 'headers' => array( - 'Content-Length' => 0 - ), - 'body' => '' - )), - array("HTTP/1.0 100 Continue\r\n\r\n", array( - 'protocol' => 'HTTP', - 'protocol_version' => '1.0', - 'code' => '100', - 'reason_phrase' => 'Continue', - 'headers' => array(), - 'body' => '' - )), - array("HTTP/1.1 204 No Content\r\nX-Foo: foo\r\nx-foo: Bar\r\nX-Foo: foo\r\n\r\n", array( - 'protocol' => 'HTTP', - 'protocol_version' => '1.1', - 'code' => '204', - 'reason_phrase' => 'No Content', - 'headers' => array( - 'X-Foo' => array('foo', 'foo'), - 'x-foo' => 'Bar' - ), - 'body' => '' - )), - array("HTTP/1.1 200 Ok that is great!\r\nContent-Length: 4\r\n\r\nTest", array( - 'protocol' => 'HTTP', - 'protocol_version' => '1.1', - 'code' => '200', - 'reason_phrase' => 'Ok that is great!', - 'headers' => array( - 'Content-Length' => 4 - ), - 'body' => 'Test' - )), - ); - } - - public function compareRequestResults($result, $expected) - { - if (!$result) { - $this->assertFalse($expected); - return; - } - - $this->assertEquals($result['method'], $expected['method']); - $this->assertEquals($result['protocol'], $expected['protocol']); - $this->assertEquals($result['protocol_version'], $expected['protocol_version']); - $this->assertEquals($result['request_url'], $expected['request_url']); - $this->assertEquals($result['body'], $expected['body']); - $this->compareHttpHeaders($result['headers'], $expected['headers']); - } - - public function compareResponseResults($result, $expected) - { - if (!$result) { - $this->assertFalse($expected); - return; - } - - $this->assertEquals($result['protocol'], $expected['protocol']); - $this->assertEquals($result['protocol_version'], $expected['protocol_version']); - $this->assertEquals($result['code'], $expected['code']); - $this->assertEquals($result['reason_phrase'], $expected['reason_phrase']); - $this->assertEquals($result['body'], $expected['body']); - $this->compareHttpHeaders($result['headers'], $expected['headers']); - } - - protected function normalizeHeaders($headers) - { - $normalized = array(); - foreach ($headers as $key => $value) { - $key = strtolower($key); - if (!isset($normalized[$key])) { - $normalized[$key] = $value; - } elseif (!is_array($normalized[$key])) { - $normalized[$key] = array($value); - } else { - $normalized[$key][] = $value; - } - } - - foreach ($normalized as $key => &$value) { - if (is_array($value)) { - sort($value); - } - } - - return $normalized; - } - - public function compareHttpHeaders($result, $expected) - { - // Aggregate all headers case-insensitively - $result = $this->normalizeHeaders($result); - $expected = $this->normalizeHeaders($expected); - $this->assertEquals($result, $expected); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Message/RequestTest.php b/vendor/guzzlehttp/guzzle/tests/Message/RequestTest.php deleted file mode 100644 index 4e670a49..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Message/RequestTest.php +++ /dev/null @@ -1,144 +0,0 @@ - '123'], Stream::factory('foo')); - $this->assertEquals('PUT', $r->getMethod()); - $this->assertEquals('/test', $r->getUrl()); - $this->assertEquals('123', $r->getHeader('test')); - $this->assertEquals('foo', $r->getBody()); - } - - public function testConstructorInitializesMessageWithMixedCaseHeaders() - { - $r = new Request('GET', '/test', [ - 'Set-Cookie' => 'foo=bar, baz=bam', - 'Set-cookie' => 'hi=there', - 'other' => ['1', '2'] - ]); - - $this->assertEquals('foo=bar, baz=bam, hi=there', $r->getHeader('Set-Cookie')); - $this->assertEquals('1, 2', $r->getHeader('other')); - } - - public function testConstructorInitializesMessageWithProtocolVersion() - { - $r = new Request('GET', '', [], null, ['protocol_version' => 10]); - $this->assertEquals(10, $r->getProtocolVersion()); - } - - public function testConstructorInitializesMessageWithEmitter() - { - $e = new Emitter(); - $r = new Request('GET', '', [], null, ['emitter' => $e]); - $this->assertSame($r->getEmitter(), $e); - } - - public function testCloneIsDeep() - { - $r = new Request('GET', '/test', ['foo' => 'baz'], Stream::factory('foo')); - $r2 = clone $r; - - $this->assertNotSame($r->getEmitter(), $r2->getEmitter()); - $this->assertEquals('foo', $r2->getBody()); - - $r->getConfig()->set('test', 123); - $this->assertFalse($r2->getConfig()->hasKey('test')); - - $r->setPath('/abc'); - $this->assertEquals('/test', $r2->getPath()); - } - - public function testCastsToString() - { - $r = new Request('GET', 'http://test.com/test', ['foo' => 'baz'], Stream::factory('body')); - $s = explode("\r\n", (string) $r); - $this->assertEquals("GET /test HTTP/1.1", $s[0]); - $this->assertContains('Host: test.com', $s); - $this->assertContains('foo: baz', $s); - $this->assertContains('', $s); - $this->assertContains('body', $s); - } - - public function testSettingUrlOverridesHostHeaders() - { - $r = new Request('GET', 'http://test.com/test'); - $r->setUrl('https://baz.com/bar'); - $this->assertEquals('baz.com', $r->getHost()); - $this->assertEquals('baz.com', $r->getHeader('Host')); - $this->assertEquals('/bar', $r->getPath()); - $this->assertEquals('https', $r->getScheme()); - } - - public function testQueryIsMutable() - { - $r = new Request('GET', 'http://www.foo.com?baz=bar'); - $this->assertEquals('baz=bar', $r->getQuery()); - $this->assertInstanceOf('GuzzleHttp\Query', $r->getQuery()); - $r->getQuery()->set('hi', 'there'); - $this->assertEquals('/?baz=bar&hi=there', $r->getResource()); - } - - public function testQueryCanChange() - { - $r = new Request('GET', 'http://www.foo.com?baz=bar'); - $r->setQuery(new Query(['foo' => 'bar'])); - $this->assertEquals('foo=bar', $r->getQuery()); - } - - public function testCanChangeMethod() - { - $r = new Request('GET', 'http://www.foo.com'); - $r->setMethod('put'); - $this->assertEquals('PUT', $r->getMethod()); - } - - public function testCanChangeSchemeWithPort() - { - $r = new Request('GET', 'http://www.foo.com:80'); - $r->setScheme('https'); - $this->assertEquals('https://www.foo.com', $r->getUrl()); - } - - public function testCanChangeScheme() - { - $r = new Request('GET', 'http://www.foo.com'); - $r->setScheme('https'); - $this->assertEquals('https://www.foo.com', $r->getUrl()); - } - - public function testCanChangeHost() - { - $r = new Request('GET', 'http://www.foo.com:222'); - $r->setHost('goo'); - $this->assertEquals('http://goo:222', $r->getUrl()); - $this->assertEquals('goo:222', $r->getHeader('host')); - $r->setHost('goo:80'); - $this->assertEquals('http://goo', $r->getUrl()); - $this->assertEquals('goo', $r->getHeader('host')); - } - - public function testCanChangePort() - { - $r = new Request('GET', 'http://www.foo.com:222'); - $this->assertSame(222, $r->getPort()); - $this->assertEquals('www.foo.com', $r->getHost()); - $this->assertEquals('www.foo.com:222', $r->getHeader('host')); - $r->setPort(80); - $this->assertSame(80, $r->getPort()); - $this->assertEquals('www.foo.com', $r->getHost()); - $this->assertEquals('www.foo.com', $r->getHeader('host')); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Message/ResponseTest.php b/vendor/guzzlehttp/guzzle/tests/Message/ResponseTest.php deleted file mode 100644 index bbae24a1..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Message/ResponseTest.php +++ /dev/null @@ -1,120 +0,0 @@ - 'hi!']); - $this->assertEquals(999, $response->getStatusCode()); - $this->assertEquals('hi!', $response->getReasonPhrase()); - } - - public function testConvertsToString() - { - $response = new Response(200); - $this->assertEquals("HTTP/1.1 200 OK\r\n\r\n", (string) $response); - // Add another header - $response = new Response(200, ['X-Test' => 'Guzzle']); - $this->assertEquals("HTTP/1.1 200 OK\r\nX-Test: Guzzle\r\n\r\n", (string) $response); - $response = new Response(200, ['Content-Length' => 4], Stream::factory('test')); - $this->assertEquals("HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\ntest", (string) $response); - } - - public function testConvertsToStringAndSeeksToByteZero() - { - $response = new Response(200); - $s = Stream::factory('foo'); - $s->read(1); - $response->setBody($s); - $this->assertEquals("HTTP/1.1 200 OK\r\n\r\nfoo", (string) $response); - } - - public function testParsesJsonResponses() - { - $json = '{"foo": "bar"}'; - $response = new Response(200, [], Stream::factory($json)); - $this->assertEquals(['foo' => 'bar'], $response->json()); - $this->assertEquals(json_decode($json), $response->json(['object' => true])); - - $response = new Response(200); - $this->assertEquals(null, $response->json()); - } - - /** - * @expectedException \GuzzleHttp\Exception\ParseException - * @expectedExceptionMessage Unable to parse JSON data: JSON_ERROR_SYNTAX - Syntax error, malformed JSON - */ - public function testThrowsExceptionWhenFailsToParseJsonResponse() - { - $response = new Response(200, [], Stream::factory('{"foo": "')); - $response->json(); - } - - public function testParsesXmlResponses() - { - $response = new Response(200, [], Stream::factory('bar')); - $this->assertEquals('bar', (string) $response->xml()->foo); - // Always return a SimpleXMLElement from the xml method - $response = new Response(200); - $this->assertEmpty((string) $response->xml()->foo); - } - - /** - * @expectedException \GuzzleHttp\Exception\XmlParseException - * @expectedExceptionMessage Unable to parse response body into XML: String could not be parsed as XML - */ - public function testThrowsExceptionWhenFailsToParseXmlResponse() - { - $response = new Response(200, [], Stream::factory('xml(); - } catch (XmlParseException $e) { - $xmlParseError = $e->getError(); - $this->assertInstanceOf('\LibXMLError', $xmlParseError); - $this->assertContains("Couldn't find end of Start Tag abc line 1", $xmlParseError->message); - throw $e; - } - } - - public function testHasEffectiveUrl() - { - $r = new Response(200); - $this->assertNull($r->getEffectiveUrl()); - $r->setEffectiveUrl('http://www.test.com'); - $this->assertEquals('http://www.test.com', $r->getEffectiveUrl()); - } - - public function testPreventsComplexExternalEntities() - { - $xml = ']>&test;'; - $response = new Response(200, [], Stream::factory($xml)); - - $oldCwd = getcwd(); - chdir(__DIR__); - try { - $xml = $response->xml(); - chdir($oldCwd); - $this->markTestIncomplete('Did not throw the expected exception! XML resolved as: ' . $xml->asXML()); - } catch (\Exception $e) { - chdir($oldCwd); - } - } - - public function testStatusAndReasonAreMutable() - { - $response = new Response(200); - $response->setStatusCode(201); - $this->assertEquals(201, $response->getStatusCode()); - $response->setReasonPhrase('Foo'); - $this->assertEquals('Foo', $response->getReasonPhrase()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/MimetypesTest.php b/vendor/guzzlehttp/guzzle/tests/MimetypesTest.php deleted file mode 100644 index a18ec381..00000000 --- a/vendor/guzzlehttp/guzzle/tests/MimetypesTest.php +++ /dev/null @@ -1,31 +0,0 @@ -assertEquals('text/x-php', Mimetypes::getInstance()->fromExtension('php')); - } - - public function testGetsFromFilename() - { - $this->assertEquals('text/x-php', Mimetypes::getInstance()->fromFilename(__FILE__)); - } - - public function testGetsFromCaseInsensitiveFilename() - { - $this->assertEquals('text/x-php', Mimetypes::getInstance()->fromFilename(strtoupper(__FILE__))); - } - - public function testReturnsNullWhenNoMatchFound() - { - $this->assertNull(Mimetypes::getInstance()->fromExtension('foobar')); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/PoolTest.php b/vendor/guzzlehttp/guzzle/tests/PoolTest.php deleted file mode 100644 index b5f02add..00000000 --- a/vendor/guzzlehttp/guzzle/tests/PoolTest.php +++ /dev/null @@ -1,319 +0,0 @@ - 10]); - $this->assertSame($c, $this->readAttribute($p, 'client')); - $this->assertEquals(10, $this->readAttribute($p, 'poolSize')); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesEachElement() - { - $c = new Client(); - $requests = ['foo']; - $p = new Pool($c, new \ArrayIterator($requests)); - $p->wait(); - } - - public function testSendsAndRealizesFuture() - { - $c = $this->getClient(); - $p = new Pool($c, [$c->createRequest('GET', 'http://foo.com')]); - $this->assertTrue($p->wait()); - $this->assertFalse($p->wait()); - $this->assertTrue($this->readAttribute($p, 'isRealized')); - $this->assertFalse($p->cancel()); - } - - public function testSendsManyRequestsInCappedPool() - { - $c = $this->getClient(); - $p = new Pool($c, [$c->createRequest('GET', 'http://foo.com')]); - $this->assertTrue($p->wait()); - $this->assertFalse($p->wait()); - } - - public function testSendsRequestsThatHaveNotBeenRealized() - { - $c = $this->getClient(); - $p = new Pool($c, [$c->createRequest('GET', 'http://foo.com')]); - $this->assertTrue($p->wait()); - $this->assertFalse($p->wait()); - $this->assertFalse($p->cancel()); - } - - public function testCancelsInFlightRequests() - { - $c = $this->getClient(); - $h = new History(); - $c->getEmitter()->attach($h); - $p = new Pool($c, [ - $c->createRequest('GET', 'http://foo.com'), - $c->createRequest('GET', 'http://foo.com', [ - 'events' => [ - 'before' => [ - 'fn' => function () use (&$p) { - $this->assertTrue($p->cancel()); - }, - 'priority' => RequestEvents::EARLY - ] - ] - ]) - ]); - ob_start(); - $p->wait(); - $contents = ob_get_clean(); - $this->assertEquals(1, count($h)); - $this->assertEquals('Cancelling', $contents); - } - - private function getClient() - { - $deferred = new Deferred(); - $future = new FutureArray( - $deferred->promise(), - function() use ($deferred) { - $deferred->resolve(['status' => 200, 'headers' => []]); - }, function () { - echo 'Cancelling'; - } - ); - - return new Client(['handler' => new MockHandler($future)]); - } - - public function testBatchesRequests() - { - $client = new Client(['handler' => function () { - throw new \RuntimeException('No network access'); - }]); - - $responses = [ - new Response(301, ['Location' => 'http://foo.com/bar']), - new Response(200), - new Response(200), - new Response(404) - ]; - - $client->getEmitter()->attach(new Mock($responses)); - $requests = [ - $client->createRequest('GET', 'http://foo.com/baz'), - $client->createRequest('HEAD', 'http://httpbin.org/get'), - $client->createRequest('PUT', 'http://httpbin.org/put'), - ]; - - $a = $b = $c = $d = 0; - $result = Pool::batch($client, $requests, [ - 'before' => function (BeforeEvent $e) use (&$a) { $a++; }, - 'complete' => function (CompleteEvent $e) use (&$b) { $b++; }, - 'error' => function (ErrorEvent $e) use (&$c) { $c++; }, - 'end' => function (EndEvent $e) use (&$d) { $d++; } - ]); - - $this->assertEquals(4, $a); - $this->assertEquals(2, $b); - $this->assertEquals(1, $c); - $this->assertEquals(3, $d); - $this->assertCount(3, $result); - $this->assertInstanceOf('GuzzleHttp\BatchResults', $result); - - // The first result is actually the second (redirect) response. - $this->assertSame($responses[1], $result[0]); - // The second result is a 1:1 request:response map - $this->assertSame($responses[2], $result[1]); - // The third entry is the 404 RequestException - $this->assertSame($responses[3], $result[2]->getResponse()); - } - - public function testBatchesRequestsWithDynamicPoolSize() - { - $client = new Client(['handler' => function () { - throw new \RuntimeException('No network access'); - }]); - - $responses = [ - new Response(301, ['Location' => 'http://foo.com/bar']), - new Response(200), - new Response(200), - new Response(404) - ]; - - $client->getEmitter()->attach(new Mock($responses)); - $requests = [ - $client->createRequest('GET', 'http://foo.com/baz'), - $client->createRequest('HEAD', 'http://httpbin.org/get'), - $client->createRequest('PUT', 'http://httpbin.org/put'), - ]; - - $a = $b = $c = $d = 0; - $result = Pool::batch($client, $requests, [ - 'before' => function (BeforeEvent $e) use (&$a) { $a++; }, - 'complete' => function (CompleteEvent $e) use (&$b) { $b++; }, - 'error' => function (ErrorEvent $e) use (&$c) { $c++; }, - 'end' => function (EndEvent $e) use (&$d) { $d++; }, - 'pool_size' => function ($queueSize) { - static $options = [1, 2, 1]; - static $queued = 0; - - $this->assertEquals( - $queued, - $queueSize, - 'The number of queued requests should be equal to the sum of pool sizes so far.' - ); - - $next = array_shift($options); - $queued += $next; - - return $next; - } - ]); - - $this->assertEquals(4, $a); - $this->assertEquals(2, $b); - $this->assertEquals(1, $c); - $this->assertEquals(3, $d); - $this->assertCount(3, $result); - $this->assertInstanceOf('GuzzleHttp\BatchResults', $result); - - // The first result is actually the second (redirect) response. - $this->assertSame($responses[1], $result[0]); - // The second result is a 1:1 request:response map - $this->assertSame($responses[2], $result[1]); - // The third entry is the 404 RequestException - $this->assertSame($responses[3], $result[2]->getResponse()); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Each event listener must be a callable or - */ - public function testBatchValidatesTheEventFormat() - { - $client = new Client(); - $requests = [$client->createRequest('GET', 'http://foo.com/baz')]; - Pool::batch($client, $requests, ['complete' => 'foo']); - } - - public function testEmitsProgress() - { - $client = new Client(['handler' => function () { - throw new \RuntimeException('No network access'); - }]); - - $responses = [new Response(200), new Response(404)]; - $client->getEmitter()->attach(new Mock($responses)); - $requests = [ - $client->createRequest('GET', 'http://foo.com/baz'), - $client->createRequest('HEAD', 'http://httpbin.org/get') - ]; - - $pool = new Pool($client, $requests); - $count = 0; - $thenned = null; - $pool->then( - function ($value) use (&$thenned) { - $thenned = $value; - }, - null, - function ($result) use (&$count, $requests) { - $this->assertSame($requests[$count], $result['request']); - if ($count == 0) { - $this->assertNull($result['error']); - $this->assertEquals(200, $result['response']->getStatusCode()); - } else { - $this->assertInstanceOf( - 'GuzzleHttp\Exception\ClientException', - $result['error'] - ); - } - $count++; - } - ); - - $pool->wait(); - $this->assertEquals(2, $count); - $this->assertEquals(true, $thenned); - } - - public function testDoesNotThrowInErrorEvent() - { - $client = new Client(); - $responses = [new Response(404)]; - $client->getEmitter()->attach(new Mock($responses)); - $requests = [$client->createRequest('GET', 'http://foo.com/baz')]; - $result = Pool::batch($client, $requests); - $this->assertCount(1, $result); - $this->assertInstanceOf('GuzzleHttp\Exception\ClientException', $result[0]); - } - - public function testHasSendMethod() - { - $client = new Client(); - $responses = [new Response(404)]; - $history = new History(); - $client->getEmitter()->attach($history); - $client->getEmitter()->attach(new Mock($responses)); - $requests = [$client->createRequest('GET', 'http://foo.com/baz')]; - Pool::send($client, $requests); - $this->assertCount(1, $history); - } - - public function testDoesNotInfinitelyRecurse() - { - $client = new Client(['handler' => function () { - throw new \RuntimeException('No network access'); - }]); - - $last = null; - $client->getEmitter()->on( - 'before', - function (BeforeEvent $e) use (&$last) { - $e->intercept(new Response(200)); - if (function_exists('xdebug_get_stack_depth')) { - if ($last) { - $this->assertEquals($last, xdebug_get_stack_depth()); - } else { - $last = xdebug_get_stack_depth(); - } - } - } - ); - - $requests = []; - for ($i = 0; $i < 100; $i++) { - $requests[] = $client->createRequest('GET', 'http://foo.com'); - } - - $pool = new Pool($client, $requests); - $pool->wait(); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Post/MultipartBodyTest.php b/vendor/guzzlehttp/guzzle/tests/Post/MultipartBodyTest.php deleted file mode 100644 index 4b3b3916..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Post/MultipartBodyTest.php +++ /dev/null @@ -1,120 +0,0 @@ - 'bar'], [ - new PostFile('foo', 'abc', 'foo.txt') - ], 'abcdef'); - } - - public function testConstructorAddsFieldsAndFiles() - { - $b = $this->getTestBody(); - $this->assertEquals('abcdef', $b->getBoundary()); - $c = (string) $b; - $this->assertContains("--abcdef\r\nContent-Disposition: form-data; name=\"foo\"\r\n\r\nbar\r\n", $c); - $this->assertContains("--abcdef\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"foo.txt\"\r\n" - . "Content-Type: text/plain\r\n\r\nabc\r\n--abcdef--", $c); - } - - public function testDoesNotModifyFieldFormat() - { - $m = new MultipartBody(['foo+baz' => 'bar+bam %20 boo'], [ - new PostFile('foo+bar', 'abc %20 123', 'foo.txt') - ], 'abcdef'); - $this->assertContains('name="foo+baz"', (string) $m); - $this->assertContains('name="foo+bar"', (string) $m); - $this->assertContains('bar+bam %20 boo', (string) $m); - $this->assertContains('abc %20 123', (string) $m); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testConstructorValidatesFiles() - { - new MultipartBody([], ['bar']); - } - - public function testConstructorCanCreateBoundary() - { - $b = new MultipartBody(); - $this->assertNotNull($b->getBoundary()); - } - - public function testWrapsStreamMethods() - { - $b = $this->getTestBody(); - $this->assertFalse($b->write('foo')); - $this->assertFalse($b->isWritable()); - $this->assertTrue($b->isReadable()); - $this->assertTrue($b->isSeekable()); - $this->assertEquals(0, $b->tell()); - } - - public function testCanDetachFieldsAndFiles() - { - $b = $this->getTestBody(); - $b->detach(); - $b->close(); - $this->assertEquals('', (string) $b); - } - - public function testIsSeekableReturnsTrueIfAllAreSeekable() - { - $s = $this->getMockBuilder('GuzzleHttp\Stream\StreamInterface') - ->setMethods(['isSeekable', 'isReadable']) - ->getMockForAbstractClass(); - $s->expects($this->once()) - ->method('isSeekable') - ->will($this->returnValue(false)); - $s->expects($this->once()) - ->method('isReadable') - ->will($this->returnValue(true)); - $p = new PostFile('foo', $s, 'foo.php'); - $b = new MultipartBody([], [$p]); - $this->assertFalse($b->isSeekable()); - $this->assertFalse($b->seek(10)); - } - - public function testReadsFromBuffer() - { - $b = $this->getTestBody(); - $c = $b->read(1); - $c .= $b->read(1); - $c .= $b->read(1); - $c .= $b->read(1); - $c .= $b->read(1); - $this->assertEquals('--abc', $c); - } - - public function testCalculatesSize() - { - $b = $this->getTestBody(); - $this->assertEquals(strlen($b), $b->getSize()); - } - - public function testCalculatesSizeAndReturnsNullForUnknown() - { - $s = $this->getMockBuilder('GuzzleHttp\Stream\StreamInterface') - ->setMethods(['getSize', 'isReadable']) - ->getMockForAbstractClass(); - $s->expects($this->once()) - ->method('getSize') - ->will($this->returnValue(null)); - $s->expects($this->once()) - ->method('isReadable') - ->will($this->returnValue(true)); - $b = new MultipartBody([], [new PostFile('foo', $s, 'foo.php')]); - $this->assertNull($b->getSize()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Post/PostBodyTest.php b/vendor/guzzlehttp/guzzle/tests/Post/PostBodyTest.php deleted file mode 100644 index 0283a5eb..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Post/PostBodyTest.php +++ /dev/null @@ -1,255 +0,0 @@ -assertTrue($b->isSeekable()); - $this->assertTrue($b->isReadable()); - $this->assertFalse($b->isWritable()); - $this->assertFalse($b->write('foo')); - } - - public function testApplyingWithNothingDoesNothing() - { - $b = new PostBody(); - $m = new Request('POST', '/'); - $b->applyRequestHeaders($m); - $this->assertFalse($m->hasHeader('Content-Length')); - $this->assertFalse($m->hasHeader('Content-Type')); - } - - public function testCanForceMultipartUploadsWhenApplying() - { - $b = new PostBody(); - $b->forceMultipartUpload(true); - $m = new Request('POST', '/'); - $b->applyRequestHeaders($m); - $this->assertContains( - 'multipart/form-data', - $m->getHeader('Content-Type') - ); - } - - public function testApplyingWithFilesAddsMultipartUpload() - { - $b = new PostBody(); - $p = new PostFile('foo', fopen(__FILE__, 'r')); - $b->addFile($p); - $this->assertEquals([$p], $b->getFiles()); - $this->assertNull($b->getFile('missing')); - $this->assertSame($p, $b->getFile('foo')); - $m = new Request('POST', '/'); - $b->applyRequestHeaders($m); - $this->assertContains( - 'multipart/form-data', - $m->getHeader('Content-Type') - ); - $this->assertTrue($m->hasHeader('Content-Length')); - } - - public function testApplyingWithFieldsAddsMultipartUpload() - { - $b = new PostBody(); - $b->setField('foo', 'bar'); - $this->assertEquals(['foo' => 'bar'], $b->getFields()); - $m = new Request('POST', '/'); - $b->applyRequestHeaders($m); - $this->assertContains( - 'application/x-www-form', - $m->getHeader('Content-Type') - ); - $this->assertTrue($m->hasHeader('Content-Length')); - } - - public function testMultipartWithNestedFields() - { - $b = new PostBody(); - $b->setField('foo', ['bar' => 'baz']); - $b->forceMultipartUpload(true); - $this->assertEquals(['foo' => ['bar' => 'baz']], $b->getFields()); - $m = new Request('POST', '/'); - $b->applyRequestHeaders($m); - $this->assertContains( - 'multipart/form-data', - $m->getHeader('Content-Type') - ); - $this->assertTrue($m->hasHeader('Content-Length')); - $contents = $b->getContents(); - $this->assertContains('name="foo[bar]"', $contents); - $this->assertNotContains('name="foo"', $contents); - } - - public function testCountProvidesFieldsAndFiles() - { - $b = new PostBody(); - $b->setField('foo', 'bar'); - $b->addFile(new PostFile('foo', fopen(__FILE__, 'r'))); - $this->assertEquals(2, count($b)); - $b->clearFiles(); - $b->removeField('foo'); - $this->assertEquals(0, count($b)); - $this->assertEquals([], $b->getFiles()); - $this->assertEquals([], $b->getFields()); - } - - public function testHasFields() - { - $b = new PostBody(); - $b->setField('foo', 'bar'); - $b->setField('baz', '123'); - $this->assertEquals('bar', $b->getField('foo')); - $this->assertEquals('123', $b->getField('baz')); - $this->assertNull($b->getField('ahh')); - $this->assertTrue($b->hasField('foo')); - $this->assertFalse($b->hasField('test')); - $b->replaceFields(['abc' => '123']); - $this->assertFalse($b->hasField('foo')); - $this->assertTrue($b->hasField('abc')); - } - - public function testConvertsFieldsToQueryStyleBody() - { - $b = new PostBody(); - $b->setField('foo', 'bar'); - $b->setField('baz', '123'); - $this->assertEquals('foo=bar&baz=123', $b); - $this->assertEquals(15, $b->getSize()); - $b->seek(0); - $this->assertEquals('foo=bar&baz=123', $b->getContents()); - $b->seek(0); - $this->assertEquals('foo=bar&baz=123', $b->read(1000)); - $this->assertEquals(15, $b->tell()); - } - - public function testCanSpecifyQueryAggregator() - { - $b = new PostBody(); - $b->setField('foo', ['baz', 'bar']); - $this->assertEquals('foo%5B0%5D=baz&foo%5B1%5D=bar', (string) $b); - $b = new PostBody(); - $b->setField('foo', ['baz', 'bar']); - $agg = Query::duplicateAggregator(); - $b->setAggregator($agg); - $this->assertEquals('foo=baz&foo=bar', (string) $b); - } - - public function testDetachesAndCloses() - { - $b = new PostBody(); - $b->setField('foo', 'bar'); - $b->detach(); - $b->close(); - $this->assertEquals('', $b->read(10)); - } - - public function testDetachesWhenBodyIsPresent() - { - $b = new PostBody(); - $b->setField('foo', 'bar'); - $b->getContents(); - $b->detach(); - } - - public function testFlushAndMetadataPlaceholders() - { - $b = new PostBody(); - $this->assertEquals([], $b->getMetadata()); - $this->assertNull($b->getMetadata('foo')); - } - - public function testCreatesMultipartUploadWithMultiFields() - { - $b = new PostBody(); - $b->setField('testing', ['baz', 'bar']); - $b->setField('other', 'hi'); - $b->setField('third', 'there'); - $b->addFile(new PostFile('foo', fopen(__FILE__, 'r'))); - $s = (string) $b; - $this->assertContains(file_get_contents(__FILE__), $s); - $this->assertContains('testing=bar', $s); - $this->assertContains( - 'Content-Disposition: form-data; name="third"', - $s - ); - $this->assertContains( - 'Content-Disposition: form-data; name="other"', - $s - ); - } - - public function testMultipartWithBase64Fields() - { - $b = new PostBody(); - $b->setField('foo64', '/xA2JhWEqPcgyLRDdir9WSRi/khpb2Lh3ooqv+5VYoc='); - $b->forceMultipartUpload(true); - $this->assertEquals( - ['foo64' => '/xA2JhWEqPcgyLRDdir9WSRi/khpb2Lh3ooqv+5VYoc='], - $b->getFields() - ); - $m = new Request('POST', '/'); - $b->applyRequestHeaders($m); - $this->assertContains( - 'multipart/form-data', - $m->getHeader('Content-Type') - ); - $this->assertTrue($m->hasHeader('Content-Length')); - $contents = $b->getContents(); - $this->assertContains('name="foo64"', $contents); - $this->assertContains( - '/xA2JhWEqPcgyLRDdir9WSRi/khpb2Lh3ooqv+5VYoc=', - $contents - ); - } - - public function testMultipartWithAmpersandInValue() - { - $b = new PostBody(); - $b->setField('a', 'b&c=d'); - $b->forceMultipartUpload(true); - $this->assertEquals(['a' => 'b&c=d'], $b->getFields()); - $m = new Request('POST', '/'); - $b->applyRequestHeaders($m); - $this->assertContains( - 'multipart/form-data', - $m->getHeader('Content-Type') - ); - $this->assertTrue($m->hasHeader('Content-Length')); - $contents = $b->getContents(); - $this->assertContains('name="a"', $contents); - $this->assertContains('b&c=d', $contents); - } - - /** - * @expectedException \GuzzleHttp\Stream\Exception\CannotAttachException - */ - public function testCannotAttach() - { - $b = new PostBody(); - $b->attach('foo'); - } - - public function testDoesNotOverwriteExistingHeaderForUrlencoded() - { - $m = new Request('POST', 'http://foo.com', [ - 'content-type' => 'application/x-www-form-urlencoded; charset=utf-8' - ]); - $b = new PostBody(); - $b->setField('foo', 'bar'); - $b->applyRequestHeaders($m); - $this->assertEquals( - 'application/x-www-form-urlencoded; charset=utf-8', - $m->getHeader('Content-Type') - ); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Post/PostFileTest.php b/vendor/guzzlehttp/guzzle/tests/Post/PostFileTest.php deleted file mode 100644 index 800cee50..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Post/PostFileTest.php +++ /dev/null @@ -1,61 +0,0 @@ -assertInstanceOf('GuzzleHttp\Post\PostFileInterface', $p); - $this->assertEquals('hi', $p->getContent()); - $this->assertEquals('foo', $p->getName()); - $this->assertEquals('/path/to/test.php', $p->getFilename()); - $this->assertEquals( - 'form-data; name="foo"; filename="test.php"', - $p->getHeaders()['Content-Disposition'] - ); - } - - public function testGetsFilenameFromMetadata() - { - $p = new PostFile('foo', fopen(__FILE__, 'r')); - $this->assertEquals(__FILE__, $p->getFilename()); - } - - public function testDefaultsToNameWhenNoFilenameExists() - { - $p = new PostFile('foo', 'bar'); - $this->assertEquals('foo', $p->getFilename()); - } - - public function testCreatesFromMultipartFormData() - { - $mp = new MultipartBody([], [], 'baz'); - $p = new PostFile('foo', $mp); - $this->assertEquals( - 'form-data; name="foo"', - $p->getHeaders()['Content-Disposition'] - ); - $this->assertEquals( - 'multipart/form-data; boundary=baz', - $p->getHeaders()['Content-Type'] - ); - } - - public function testCanAddHeaders() - { - $p = new PostFile('foo', Stream::factory('hi'), 'test.php', [ - 'X-Foo' => '123', - 'Content-Disposition' => 'bar' - ]); - $this->assertEquals('bar', $p->getHeaders()['Content-Disposition']); - $this->assertEquals('123', $p->getHeaders()['X-Foo']); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/QueryParserTest.php b/vendor/guzzlehttp/guzzle/tests/QueryParserTest.php deleted file mode 100644 index e9075a80..00000000 --- a/vendor/guzzlehttp/guzzle/tests/QueryParserTest.php +++ /dev/null @@ -1,80 +0,0 @@ - ['a', 'b']]], - // Can parse multi-valued items that use numeric indices - ['q[0]=a&q[1]=b', ['q' => ['a', 'b']]], - // Can parse duplicates and does not include numeric indices - ['q[]=a&q[]=b', ['q' => ['a', 'b']]], - // Ensures that the value of "q" is an array even though one value - ['q[]=a', ['q' => ['a']]], - // Does not modify "." to "_" like PHP's parse_str() - ['q.a=a&q.b=b', ['q.a' => 'a', 'q.b' => 'b']], - // Can decode %20 to " " - ['q%20a=a%20b', ['q a' => 'a b']], - // Can parse funky strings with no values by assigning each to null - ['q&a', ['q' => null, 'a' => null]], - // Does not strip trailing equal signs - ['data=abc=', ['data' => 'abc=']], - // Can store duplicates without affecting other values - ['foo=a&foo=b&?Āµ=c', ['foo' => ['a', 'b'], '?Āµ' => 'c']], - // Sets value to null when no "=" is present - ['foo', ['foo' => null]], - // Preserves "0" keys. - ['0', ['0' => null]], - // Sets the value to an empty string when "=" is present - ['0=', ['0' => '']], - // Preserves falsey keys - ['var=0', ['var' => '0']], - // Can deeply nest and store duplicate PHP values - ['a[b][c]=1&a[b][c]=2', [ - 'a' => ['b' => ['c' => ['1', '2']]] - ]], - // Can parse PHP style arrays - ['a[b]=c&a[d]=e', ['a' => ['b' => 'c', 'd' => 'e']]], - // Ensure it doesn't leave things behind with repeated values - // Can parse mult-values items - ['q=a&q=b&q=c', ['q' => ['a', 'b', 'c']]], - ]; - } - - /** - * @dataProvider parseQueryProvider - */ - public function testParsesQueries($input, $output) - { - $query = Query::fromString($input); - $this->assertEquals($output, $query->toArray()); - // Normalize the input and output - $query->setEncodingType(false); - $this->assertEquals(rawurldecode($input), (string) $query); - } - - public function testConvertsPlusSymbolsToSpacesByDefault() - { - $query = Query::fromString('var=foo+bar', true); - $this->assertEquals('foo bar', $query->get('var')); - } - - public function testCanControlDecodingType() - { - $qp = new QueryParser(); - $q = new Query(); - $qp->parseInto($q, 'var=foo+bar', Query::RFC3986); - $this->assertEquals('foo+bar', $q->get('var')); - $qp->parseInto($q, 'var=foo+bar', Query::RFC1738); - $this->assertEquals('foo bar', $q->get('var')); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/QueryTest.php b/vendor/guzzlehttp/guzzle/tests/QueryTest.php deleted file mode 100644 index 8b9d3448..00000000 --- a/vendor/guzzlehttp/guzzle/tests/QueryTest.php +++ /dev/null @@ -1,171 +0,0 @@ - 'baz', 'bar' => 'bam boozle']); - $this->assertEquals('foo=baz&bar=bam%20boozle', (string) $q); - } - - public function testCanDisableUrlEncoding() - { - $q = new Query(['bar' => 'bam boozle']); - $q->setEncodingType(false); - $this->assertEquals('bar=bam boozle', (string) $q); - } - - public function testCanSpecifyRfc1783UrlEncodingType() - { - $q = new Query(['bar abc' => 'bam boozle']); - $q->setEncodingType(Query::RFC1738); - $this->assertEquals('bar+abc=bam+boozle', (string) $q); - } - - public function testCanSpecifyRfc3986UrlEncodingType() - { - $q = new Query(['bar abc' => 'bam boozle', 'įˆ“' => 'hi']); - $q->setEncodingType(Query::RFC3986); - $this->assertEquals('bar%20abc=bam%20boozle&%E1%88%B4=hi', (string) $q); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesEncodingType() - { - (new Query(['bar' => 'bam boozle']))->setEncodingType('foo'); - } - - public function testAggregatesMultipleValues() - { - $q = new Query(['foo' => ['bar', 'baz']]); - $this->assertEquals('foo%5B0%5D=bar&foo%5B1%5D=baz', (string) $q); - } - - public function testCanSetAggregator() - { - $q = new Query(['foo' => ['bar', 'baz']]); - $q->setAggregator(function (array $data) { - return ['foo' => ['barANDbaz']]; - }); - $this->assertEquals('foo=barANDbaz', (string) $q); - } - - public function testAllowsMultipleValuesPerKey() - { - $q = new Query(); - $q->add('facet', 'size'); - $q->add('facet', 'width'); - $q->add('facet.field', 'foo'); - // Use the duplicate aggregator - $q->setAggregator($q::duplicateAggregator()); - $this->assertEquals('facet=size&facet=width&facet.field=foo', (string) $q); - } - - public function testAllowsZeroValues() - { - $query = new Query(array( - 'foo' => 0, - 'baz' => '0', - 'bar' => null, - 'boo' => false - )); - $this->assertEquals('foo=0&baz=0&bar&boo=', (string) $query); - } - - private $encodeData = [ - 't' => [ - 'v1' => ['a', '1'], - 'v2' => 'b', - 'v3' => ['v4' => 'c', 'v5' => 'd'] - ] - ]; - - public function testEncodesDuplicateAggregator() - { - $agg = Query::duplicateAggregator(); - $result = $agg($this->encodeData); - $this->assertEquals(array( - 't[v1]' => ['a', '1'], - 't[v2]' => ['b'], - 't[v3][v4]' => ['c'], - 't[v3][v5]' => ['d'], - ), $result); - } - - public function testDuplicateEncodesNoNumericIndices() - { - $agg = Query::duplicateAggregator(); - $result = $agg($this->encodeData); - $this->assertEquals(array( - 't[v1]' => ['a', '1'], - 't[v2]' => ['b'], - 't[v3][v4]' => ['c'], - 't[v3][v5]' => ['d'], - ), $result); - } - - public function testEncodesPhpAggregator() - { - $agg = Query::phpAggregator(); - $result = $agg($this->encodeData); - $this->assertEquals(array( - 't[v1][0]' => ['a'], - 't[v1][1]' => ['1'], - 't[v2]' => ['b'], - 't[v3][v4]' => ['c'], - 't[v3][v5]' => ['d'], - ), $result); - } - - public function testPhpEncodesNoNumericIndices() - { - $agg = Query::phpAggregator(false); - $result = $agg($this->encodeData); - $this->assertEquals(array( - 't[v1][]' => ['a', '1'], - 't[v2]' => ['b'], - 't[v3][v4]' => ['c'], - 't[v3][v5]' => ['d'], - ), $result); - } - - public function testCanDisableUrlEncodingDecoding() - { - $q = Query::fromString('foo=bar+baz boo%20', false); - $this->assertEquals('bar+baz boo%20', $q['foo']); - $this->assertEquals('foo=bar+baz boo%20', (string) $q); - } - - public function testCanChangeUrlEncodingDecodingToRfc1738() - { - $q = Query::fromString('foo=bar+baz', Query::RFC1738); - $this->assertEquals('bar baz', $q['foo']); - $this->assertEquals('foo=bar+baz', (string) $q); - } - - public function testCanChangeUrlEncodingDecodingToRfc3986() - { - $q = Query::fromString('foo=bar%20baz', Query::RFC3986); - $this->assertEquals('bar baz', $q['foo']); - $this->assertEquals('foo=bar%20baz', (string) $q); - } - - public function testQueryStringsAllowSlashButDoesNotDecodeWhenDisable() - { - $q = Query::fromString('foo=bar%2Fbaz&bam=boo%20boo', Query::RFC3986); - $q->setEncodingType(false); - $this->assertEquals('foo=bar/baz&bam=boo boo', (string) $q); - } - - public function testQueryStringsAllowDecodingEncodingCompletelyDisabled() - { - $q = Query::fromString('foo=bar%2Fbaz&bam=boo boo!', false); - $this->assertEquals('foo=bar%2Fbaz&bam=boo boo!', (string) $q); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/RequestFsmTest.php b/vendor/guzzlehttp/guzzle/tests/RequestFsmTest.php deleted file mode 100644 index dd676840..00000000 --- a/vendor/guzzlehttp/guzzle/tests/RequestFsmTest.php +++ /dev/null @@ -1,187 +0,0 @@ -mf = new MessageFactory(); - } - - public function testEmitsBeforeEventInTransition() - { - $fsm = new RequestFsm(function () { - return new CompletedFutureArray(['status' => 200]); - }, $this->mf); - $t = new Transaction(new Client(), new Request('GET', 'http://foo.com')); - $c = false; - $t->request->getEmitter()->on('before', function (BeforeEvent $e) use (&$c) { - $c = true; - }); - $fsm($t); - $this->assertTrue($c); - } - - public function testEmitsCompleteEventInTransition() - { - $fsm = new RequestFsm(function () { - return new CompletedFutureArray(['status' => 200]); - }, $this->mf); - $t = new Transaction(new Client(), new Request('GET', 'http://foo.com')); - $t->response = new Response(200); - $t->state = 'complete'; - $c = false; - $t->request->getEmitter()->on('complete', function (CompleteEvent $e) use (&$c) { - $c = true; - }); - $fsm($t); - $this->assertTrue($c); - } - - public function testDoesNotEmitCompleteForFuture() - { - $fsm = new RequestFsm(function () { - return new CompletedFutureArray(['status' => 200]); - }, $this->mf); - $t = new Transaction(new Client(), new Request('GET', 'http://foo.com')); - $deferred = new Deferred(); - $t->response = new FutureResponse($deferred->promise()); - $t->state = 'complete'; - $c = false; - $t->request->getEmitter()->on('complete', function (CompleteEvent $e) use (&$c) { - $c = true; - }); - $fsm($t); - $this->assertFalse($c); - } - - public function testTransitionsThroughSuccessfulTransfer() - { - $client = new Client(); - $client->getEmitter()->attach(new Mock([new Response(200)])); - $request = $client->createRequest('GET', 'http://ewfewwef.com'); - $this->addListeners($request, $calls); - $client->send($request); - $this->assertEquals(['before', 'complete', 'end'], $calls); - } - - public function testTransitionsThroughErrorsInBefore() - { - $fsm = new RequestFsm(function () { - return new CompletedFutureArray(['status' => 200]); - }, $this->mf); - $client = new Client(); - $request = $client->createRequest('GET', 'http://ewfewwef.com'); - $t = new Transaction($client, $request); - $calls = []; - $this->addListeners($t->request, $calls); - $t->request->getEmitter()->on('before', function (BeforeEvent $e) { - throw new \Exception('foo'); - }); - try { - $fsm($t); - $this->fail('did not throw'); - } catch (RequestException $e) { - $this->assertContains('foo', $t->exception->getMessage()); - $this->assertEquals(['before', 'error', 'end'], $calls); - } - } - - public function testTransitionsThroughErrorsInComplete() - { - $client = new Client(); - $client->getEmitter()->attach(new Mock([new Response(200)])); - $request = $client->createRequest('GET', 'http://ewfewwef.com'); - $this->addListeners($request, $calls); - $request->getEmitter()->once('complete', function (CompleteEvent $e) { - throw new \Exception('foo'); - }); - try { - $client->send($request); - $this->fail('did not throw'); - } catch (RequestException $e) { - $this->assertContains('foo', $e->getMessage()); - $this->assertEquals(['before', 'complete', 'error', 'end'], $calls); - } - } - - public function testTransitionsThroughErrorInterception() - { - $fsm = new RequestFsm(function () { - return new CompletedFutureArray(['status' => 404]); - }, $this->mf); - $client = new Client(); - $request = $client->createRequest('GET', 'http://ewfewwef.com'); - $t = new Transaction($client, $request); - $calls = []; - $this->addListeners($t->request, $calls); - $t->request->getEmitter()->on('error', function (ErrorEvent $e) { - $e->intercept(new Response(200)); - }); - $fsm($t); - $this->assertEquals(200, $t->response->getStatusCode()); - $this->assertNull($t->exception); - $this->assertEquals(['before', 'complete', 'error', 'complete', 'end'], $calls); - } - - private function addListeners(RequestInterface $request, &$calls) - { - $request->getEmitter()->on('before', function (BeforeEvent $e) use (&$calls) { - $calls[] = 'before'; - }, RequestEvents::EARLY); - $request->getEmitter()->on('complete', function (CompleteEvent $e) use (&$calls) { - $calls[] = 'complete'; - }, RequestEvents::EARLY); - $request->getEmitter()->on('error', function (ErrorEvent $e) use (&$calls) { - $calls[] = 'error'; - }, RequestEvents::EARLY); - $request->getEmitter()->on('end', function (EndEvent $e) use (&$calls) { - $calls[] = 'end'; - }, RequestEvents::EARLY); - } - - /** - * @expectedException \GuzzleHttp\Exception\RequestException - * @expectedExceptionMessage Too many state transitions - */ - public function testDetectsInfiniteLoops() - { - $client = new Client([ - 'fsm' => $fsm = new RequestFsm( - function () { - return new CompletedFutureArray(['status' => 200]); - }, - new MessageFactory(), - 3 - ) - ]); - $request = $client->createRequest('GET', 'http://foo.com:123'); - $request->getEmitter()->on('before', function () { - throw new \Exception('foo'); - }); - $request->getEmitter()->on('error', function ($e) { - $e->retry(); - }); - $client->send($request); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/RingBridgeTest.php b/vendor/guzzlehttp/guzzle/tests/RingBridgeTest.php deleted file mode 100644 index dc26a42a..00000000 --- a/vendor/guzzlehttp/guzzle/tests/RingBridgeTest.php +++ /dev/null @@ -1,195 +0,0 @@ - 'hello' - ], $stream); - $request->getConfig()->set('foo', 'bar'); - $trans = new Transaction(new Client(), $request); - $factory = new MessageFactory(); - $fsm = new RequestFsm(function () {}, new MessageFactory()); - $r = RingBridge::prepareRingRequest($trans, $factory, $fsm); - $this->assertEquals('http', $r['scheme']); - $this->assertEquals('1.1', $r['version']); - $this->assertEquals('GET', $r['http_method']); - $this->assertEquals('http://httpbin.org/get?a=b', $r['url']); - $this->assertEquals('/get', $r['uri']); - $this->assertEquals('a=b', $r['query_string']); - $this->assertEquals([ - 'Host' => ['httpbin.org'], - 'test' => ['hello'] - ], $r['headers']); - $this->assertSame($stream, $r['body']); - $this->assertEquals(['foo' => 'bar'], $r['client']); - $this->assertFalse($r['future']); - } - - public function testCreatesRingRequestsWithNullQueryString() - { - $request = new Request('GET', 'http://httpbin.org'); - $trans = new Transaction(new Client(), $request); - $factory = new MessageFactory(); - $fsm = new RequestFsm(function () {}, new MessageFactory()); - $r = RingBridge::prepareRingRequest($trans, $factory, $fsm); - $this->assertNull($r['query_string']); - $this->assertEquals('/', $r['uri']); - $this->assertEquals(['Host' => ['httpbin.org']], $r['headers']); - $this->assertNull($r['body']); - $this->assertEquals([], $r['client']); - } - - public function testAddsProgress() - { - Server::enqueue([new Response(200)]); - $client = new Client(['base_url' => Server::$url]); - $request = $client->createRequest('GET'); - $called = false; - $request->getEmitter()->on( - 'progress', - function (ProgressEvent $e) use (&$called) { - $called = true; - } - ); - $this->assertEquals(200, $client->send($request)->getStatusCode()); - $this->assertTrue($called); - } - - public function testGetsResponseProtocolVersionAndEffectiveUrlAndReason() - { - $client = new Client([ - 'handler' => new MockHandler([ - 'status' => 200, - 'reason' => 'test', - 'headers' => [], - 'version' => '1.0', - 'effective_url' => 'http://foo.com' - ]) - ]); - $request = $client->createRequest('GET', 'http://foo.com'); - $response = $client->send($request); - $this->assertEquals('1.0', $response->getProtocolVersion()); - $this->assertEquals('http://foo.com', $response->getEffectiveUrl()); - $this->assertEquals('test', $response->getReasonPhrase()); - } - - public function testGetsStreamFromResponse() - { - $res = fopen('php://temp', 'r+'); - fwrite($res, 'foo'); - rewind($res); - $client = new Client([ - 'handler' => new MockHandler([ - 'status' => 200, - 'headers' => [], - 'body' => $res - ]) - ]); - $request = $client->createRequest('GET', 'http://foo.com'); - $response = $client->send($request); - $this->assertEquals('foo', (string) $response->getBody()); - } - - public function testEmitsErrorEventOnError() - { - $client = new Client(['base_url' => 'http://127.0.0.1:123']); - $request = $client->createRequest('GET'); - $called = false; - $request->getEmitter()->on('error', function () use (&$called) { - $called = true; - }); - $request->getConfig()['timeout'] = 0.001; - $request->getConfig()['connect_timeout'] = 0.001; - try { - $client->send($request); - $this->fail('did not throw'); - } catch (RequestException $e) { - $this->assertSame($request, $e->getRequest()); - $this->assertContains('cURL error', $e->getMessage()); - $this->assertTrue($called); - } - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesRingRequest() - { - RingBridge::fromRingRequest([]); - } - - public function testCreatesRequestFromRing() - { - $request = RingBridge::fromRingRequest([ - 'http_method' => 'GET', - 'uri' => '/', - 'headers' => [ - 'foo' => ['bar'], - 'host' => ['foo.com'] - ], - 'body' => 'test', - 'version' => '1.0' - ]); - $this->assertEquals('GET', $request->getMethod()); - $this->assertEquals('http://foo.com/', $request->getUrl()); - $this->assertEquals('1.0', $request->getProtocolVersion()); - $this->assertEquals('test', (string) $request->getBody()); - $this->assertEquals('bar', $request->getHeader('foo')); - } - - public function testCanInterceptException() - { - $client = new Client(['base_url' => 'http://127.0.0.1:123']); - $request = $client->createRequest('GET'); - $called = false; - $request->getEmitter()->on( - 'error', - function (ErrorEvent $e) use (&$called) { - $called = true; - $e->intercept(new Response(200)); - } - ); - $request->getConfig()['timeout'] = 0.001; - $request->getConfig()['connect_timeout'] = 0.001; - $this->assertEquals(200, $client->send($request)->getStatusCode()); - $this->assertTrue($called); - } - - public function testCreatesLongException() - { - $r = new Request('GET', 'http://www.google.com'); - $e = RingBridge::getNoRingResponseException($r); - $this->assertInstanceOf('GuzzleHttp\Exception\RequestException', $e); - $this->assertSame($r, $e->getRequest()); - } - - public function testEnsuresResponseOrExceptionWhenCompletingResponse() - { - $trans = new Transaction(new Client(), new Request('GET', 'http://f.co')); - $f = new MessageFactory(); - $fsm = new RequestFsm(function () {}, new MessageFactory()); - try { - RingBridge::completeRingResponse($trans, [], $f, $fsm); - } catch (RequestException $e) { - $this->assertSame($trans->request, $e->getRequest()); - $this->assertContains('RingPHP', $e->getMessage()); - } - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Server.php b/vendor/guzzlehttp/guzzle/tests/Server.php deleted file mode 100644 index 1de20e38..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Server.php +++ /dev/null @@ -1,107 +0,0 @@ -fromMessage($response); - } elseif (!($response instanceof ResponseInterface)) { - throw new \Exception('Responses must be strings or Responses'); - } - $data[] = self::convertResponse($response); - } - - TestServer::enqueue($data); - } - - /** - * Get all of the received requests - * - * @param bool $hydrate Set to TRUE to turn the messages into - * actual {@see RequestInterface} objects. If $hydrate is FALSE, - * requests will be returned as strings. - * - * @return array - * @throws \RuntimeException - */ - public static function received($hydrate = false) - { - $response = TestServer::received(); - - if ($hydrate) { - $c = new Client(); - $factory = new MessageFactory(); - $response = array_map(function($message) use ($factory, $c) { - return RingBridge::fromRingRequest($message); - }, $response); - } - - return $response; - } - - public static function flush() - { - TestServer::flush(); - } - - public static function stop() - { - TestServer::stop(); - } - - public static function wait($maxTries = 5) - { - TestServer::wait($maxTries); - } - - public static function start() - { - TestServer::start(); - } - - private static function convertResponse(Response $response) - { - $headers = array_map(function ($h) { - return implode(', ', $h); - }, $response->getHeaders()); - - return [ - 'status' => $response->getStatusCode(), - 'reason' => $response->getReasonPhrase(), - 'headers' => $headers, - 'body' => base64_encode((string) $response->getBody()) - ]; - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Subscriber/CookieTest.php b/vendor/guzzlehttp/guzzle/tests/Subscriber/CookieTest.php deleted file mode 100644 index bc17e2dc..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Subscriber/CookieTest.php +++ /dev/null @@ -1,74 +0,0 @@ -getMockBuilder('GuzzleHttp\Cookie\CookieJar') - ->setMethods(array('extractCookies')) - ->getMock(); - - $mock->expects($this->exactly(1)) - ->method('extractCookies') - ->with($request, $response); - - $plugin = new Cookie($mock); - $t = new Transaction(new Client(), $request); - $t->response = $response; - $plugin->onComplete(new CompleteEvent($t)); - } - - public function testProvidesCookieJar() - { - $jar = new CookieJar(); - $plugin = new Cookie($jar); - $this->assertSame($jar, $plugin->getCookieJar()); - } - - public function testCookiesAreExtractedFromRedirectResponses() - { - $jar = new CookieJar(); - $cookie = new Cookie($jar); - $history = new History(); - $mock = new Mock([ - "HTTP/1.1 302 Moved Temporarily\r\n" . - "Set-Cookie: test=583551; Domain=www.foo.com; Expires=Wednesday, 23-Mar-2050 19:49:45 GMT; Path=/\r\n" . - "Location: /redirect\r\n\r\n", - "HTTP/1.1 200 OK\r\n" . - "Content-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\n" . - "Content-Length: 0\r\n\r\n" - ]); - $client = new Client(['base_url' => 'http://www.foo.com']); - $client->getEmitter()->attach($cookie); - $client->getEmitter()->attach($mock); - $client->getEmitter()->attach($history); - - $client->get(); - $request = $client->createRequest('GET', '/'); - $client->send($request); - - $this->assertEquals('test=583551', $request->getHeader('Cookie')); - $requests = $history->getRequests(); - // Confirm subsequent requests have the cookie. - $this->assertEquals('test=583551', $requests[2]->getHeader('Cookie')); - // Confirm the redirected request has the cookie. - $this->assertEquals('test=583551', $requests[1]->getHeader('Cookie')); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Subscriber/HistoryTest.php b/vendor/guzzlehttp/guzzle/tests/Subscriber/HistoryTest.php deleted file mode 100644 index d28e301c..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Subscriber/HistoryTest.php +++ /dev/null @@ -1,140 +0,0 @@ -response = $response; - $e = new RequestException('foo', $request, $response); - $ev = new ErrorEvent($t, $e); - $h = new History(2); - $h->onError($ev); - // Only tracks when no response is present - $this->assertEquals([], $h->getRequests()); - } - - public function testLogsConnectionErrors() - { - $request = new Request('GET', '/'); - $t = new Transaction(new Client(), $request); - $e = new RequestException('foo', $request); - $ev = new ErrorEvent($t, $e); - $h = new History(); - $h->onError($ev); - $this->assertEquals([$request], $h->getRequests()); - } - - public function testMaintainsLimitValue() - { - $request = new Request('GET', '/'); - $response = new Response(200); - $t = new Transaction(new Client(), $request); - $t->response = $response; - $ev = new CompleteEvent($t); - $h = new History(2); - $h->onComplete($ev); - $h->onComplete($ev); - $h->onComplete($ev); - $this->assertEquals(2, count($h)); - $this->assertSame($request, $h->getLastRequest()); - $this->assertSame($response, $h->getLastResponse()); - foreach ($h as $trans) { - $this->assertInstanceOf('GuzzleHttp\Message\RequestInterface', $trans['request']); - $this->assertInstanceOf('GuzzleHttp\Message\ResponseInterface', $trans['response']); - } - return $h; - } - - /** - * @depends testMaintainsLimitValue - */ - public function testClearsHistory($h) - { - $this->assertEquals(2, count($h)); - $h->clear(); - $this->assertEquals(0, count($h)); - } - - public function testWorksWithMock() - { - $client = new Client(['base_url' => 'http://localhost/']); - $h = new History(); - $client->getEmitter()->attach($h); - $mock = new Mock([new Response(200), new Response(201), new Response(202)]); - $client->getEmitter()->attach($mock); - $request = $client->createRequest('GET', '/'); - $client->send($request); - $request->setMethod('PUT'); - $client->send($request); - $request->setMethod('POST'); - $client->send($request); - $this->assertEquals(3, count($h)); - - $result = implode("\n", array_map(function ($line) { - return strpos($line, 'User-Agent') === 0 - ? 'User-Agent:' - : trim($line); - }, explode("\n", $h))); - - $this->assertEquals("> GET / HTTP/1.1 -Host: localhost -User-Agent: - -< HTTP/1.1 200 OK - -> PUT / HTTP/1.1 -Host: localhost -User-Agent: - -< HTTP/1.1 201 Created - -> POST / HTTP/1.1 -Host: localhost -User-Agent: - -< HTTP/1.1 202 Accepted -", $result); - } - - public function testCanCastToString() - { - $client = new Client(['base_url' => 'http://localhost/']); - $h = new History(); - $client->getEmitter()->attach($h); - - $mock = new Mock(array( - new Response(301, array('Location' => '/redirect1', 'Content-Length' => 0)), - new Response(307, array('Location' => '/redirect2', 'Content-Length' => 0)), - new Response(200, array('Content-Length' => '2'), Stream::factory('HI')) - )); - - $client->getEmitter()->attach($mock); - $request = $client->createRequest('GET', '/'); - $client->send($request); - $this->assertEquals(3, count($h)); - - $h = str_replace("\r", '', $h); - $this->assertContains("> GET / HTTP/1.1\nHost: localhost\nUser-Agent:", $h); - $this->assertContains("< HTTP/1.1 301 Moved Permanently\nLocation: /redirect1", $h); - $this->assertContains("< HTTP/1.1 307 Temporary Redirect\nLocation: /redirect2", $h); - $this->assertContains("< HTTP/1.1 200 OK\nContent-Length: 2\n\nHI", $h); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Subscriber/HttpErrorTest.php b/vendor/guzzlehttp/guzzle/tests/Subscriber/HttpErrorTest.php deleted file mode 100644 index b0266340..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Subscriber/HttpErrorTest.php +++ /dev/null @@ -1,60 +0,0 @@ -getEvent(); - $event->intercept(new Response(200)); - (new HttpError())->onComplete($event); - } - - /** - * @expectedException \GuzzleHttp\Exception\ClientException - */ - public function testThrowsClientExceptionOnFailure() - { - $event = $this->getEvent(); - $event->intercept(new Response(403)); - (new HttpError())->onComplete($event); - } - - /** - * @expectedException \GuzzleHttp\Exception\ServerException - */ - public function testThrowsServerExceptionOnFailure() - { - $event = $this->getEvent(); - $event->intercept(new Response(500)); - (new HttpError())->onComplete($event); - } - - private function getEvent() - { - return new CompleteEvent(new Transaction(new Client(), new Request('PUT', '/'))); - } - - /** - * @expectedException \GuzzleHttp\Exception\ClientException - */ - public function testFullTransaction() - { - $client = new Client(); - $client->getEmitter()->attach(new Mock([ - new Response(403) - ])); - $client->get('http://httpbin.org'); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Subscriber/MockTest.php b/vendor/guzzlehttp/guzzle/tests/Subscriber/MockTest.php deleted file mode 100644 index 936edf26..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Subscriber/MockTest.php +++ /dev/null @@ -1,225 +0,0 @@ -promise(), - function () use ($deferred, $wait) { - $deferred->resolve($wait()); - }, - $cancel - ); - } - - public function testDescribesSubscribedEvents() - { - $mock = new Mock(); - $this->assertInternalType('array', $mock->getEvents()); - } - - public function testIsCountable() - { - $plugin = new Mock(); - $plugin->addResponse((new MessageFactory())->fromMessage("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")); - $this->assertEquals(1, count($plugin)); - } - - public function testCanClearQueue() - { - $plugin = new Mock(); - $plugin->addResponse((new MessageFactory())->fromMessage("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")); - $plugin->clearQueue(); - $this->assertEquals(0, count($plugin)); - } - - public function testRetrievesResponsesFromFiles() - { - $tmp = tempnam('/tmp', 'tfile'); - file_put_contents($tmp, "HTTP/1.1 201 OK\r\nContent-Length: 0\r\n\r\n"); - $plugin = new Mock(); - $plugin->addResponse($tmp); - unlink($tmp); - $this->assertEquals(1, count($plugin)); - $q = $this->readAttribute($plugin, 'queue'); - $this->assertEquals(201, $q[0]->getStatusCode()); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testThrowsExceptionWhenInvalidResponse() - { - (new Mock())->addResponse(false); - } - - public function testAddsMockResponseToRequestFromClient() - { - $response = new Response(200); - $t = new Transaction(new Client(), new Request('GET', '/')); - $m = new Mock([$response]); - $ev = new BeforeEvent($t); - $m->onBefore($ev); - $this->assertSame($response, $t->response); - } - - /** - * @expectedException \OutOfBoundsException - */ - public function testUpdateThrowsExceptionWhenEmpty() - { - $p = new Mock(); - $ev = new BeforeEvent(new Transaction(new Client(), new Request('GET', '/'))); - $p->onBefore($ev); - } - - public function testReadsBodiesFromMockedRequests() - { - $m = new Mock([new Response(200)]); - $client = new Client(['base_url' => 'http://test.com']); - $client->getEmitter()->attach($m); - $body = Stream::factory('foo'); - $client->put('/', ['body' => $body]); - $this->assertEquals(3, $body->tell()); - } - - public function testCanMockBadRequestExceptions() - { - $client = new Client(['base_url' => 'http://test.com']); - $request = $client->createRequest('GET', '/'); - $ex = new RequestException('foo', $request); - $mock = new Mock([$ex]); - $this->assertCount(1, $mock); - $request->getEmitter()->attach($mock); - - try { - $client->send($request); - $this->fail('Did not dequeue an exception'); - } catch (RequestException $e) { - $this->assertSame($e, $ex); - $this->assertSame($request, $ex->getRequest()); - } - } - - public function testCanMockFutureResponses() - { - $client = new Client(['base_url' => 'http://test.com']); - $request = $client->createRequest('GET', '/', ['future' => true]); - $response = new Response(200); - $future = self::createFuture(function () use ($response) { - return $response; - }); - $mock = new Mock([$future]); - $this->assertCount(1, $mock); - $request->getEmitter()->attach($mock); - $res = $client->send($request); - $this->assertSame($future, $res); - $this->assertFalse($this->readAttribute($res, 'isRealized')); - $this->assertSame($response, $res->wait()); - } - - public function testCanMockExceptionFutureResponses() - { - $client = new Client(['base_url' => 'http://test.com']); - $request = $client->createRequest('GET', '/', ['future' => true]); - $future = self::createFuture(function () use ($request) { - throw new RequestException('foo', $request); - }); - - $mock = new Mock([$future]); - $request->getEmitter()->attach($mock); - $response = $client->send($request); - $this->assertSame($future, $response); - $this->assertFalse($this->readAttribute($response, 'isRealized')); - - try { - $response->wait(); - $this->fail('Did not throw'); - } catch (RequestException $e) { - $this->assertContains('foo', $e->getMessage()); - } - } - - public function testSaveToFile() - { - $filename = sys_get_temp_dir().'/mock_test_'.uniqid(); - $file = tmpfile(); - $stream = new Stream(tmpfile()); - - $m = new Mock([ - new Response(200, [], Stream::factory('TEST FILENAME')), - new Response(200, [], Stream::factory('TEST FILE')), - new Response(200, [], Stream::factory('TEST STREAM')), - ]); - - $client = new Client(); - $client->getEmitter()->attach($m); - - $client->get('/', ['save_to' => $filename]); - $client->get('/', ['save_to' => $file]); - $client->get('/', ['save_to' => $stream]); - - $this->assertFileExists($filename); - $this->assertEquals('TEST FILENAME', file_get_contents($filename)); - - $meta = stream_get_meta_data($file); - - $this->assertFileExists($meta['uri']); - $this->assertEquals('TEST FILE', file_get_contents($meta['uri'])); - - $this->assertFileExists($stream->getMetadata('uri')); - $this->assertEquals('TEST STREAM', file_get_contents($stream->getMetadata('uri'))); - - unlink($filename); - } - - public function testCanMockFailedFutureResponses() - { - $client = new Client(['base_url' => 'http://test.com']); - $request = $client->createRequest('GET', '/', ['future' => true]); - - // The first mock will be a mocked future response. - $future = self::createFuture(function () use ($client) { - // When dereferenced, we will set a mocked response and send - // another request. - $client->get('http://httpbin.org', ['events' => [ - 'before' => function (BeforeEvent $e) { - $e->intercept(new Response(404)); - } - ]]); - }); - - $mock = new Mock([$future]); - $request->getEmitter()->attach($mock); - $response = $client->send($request); - $this->assertSame($future, $response); - $this->assertFalse($this->readAttribute($response, 'isRealized')); - - try { - $response->wait(); - $this->fail('Did not throw'); - } catch (RequestException $e) { - $this->assertEquals(404, $e->getResponse()->getStatusCode()); - } - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Subscriber/PrepareTest.php b/vendor/guzzlehttp/guzzle/tests/Subscriber/PrepareTest.php deleted file mode 100644 index d07fdb44..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Subscriber/PrepareTest.php +++ /dev/null @@ -1,213 +0,0 @@ -getTrans(); - $s->onBefore(new BeforeEvent($t)); - $this->assertFalse($t->request->hasHeader('Expect')); - } - - public function testAppliesPostBody() - { - $s = new Prepare(); - $t = $this->getTrans(); - $p = $this->getMockBuilder('GuzzleHttp\Post\PostBody') - ->setMethods(['applyRequestHeaders']) - ->getMockForAbstractClass(); - $p->expects($this->once()) - ->method('applyRequestHeaders'); - $t->request->setBody($p); - $s->onBefore(new BeforeEvent($t)); - } - - public function testAddsExpectHeaderWithTrue() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->getConfig()->set('expect', true); - $t->request->setBody(Stream::factory('foo')); - $s->onBefore(new BeforeEvent($t)); - $this->assertEquals('100-Continue', $t->request->getHeader('Expect')); - } - - public function testAddsExpectHeaderBySize() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->getConfig()->set('expect', 2); - $t->request->setBody(Stream::factory('foo')); - $s->onBefore(new BeforeEvent($t)); - $this->assertTrue($t->request->hasHeader('Expect')); - } - - public function testDoesNotModifyExpectHeaderIfPresent() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->setHeader('Expect', 'foo'); - $t->request->setBody(Stream::factory('foo')); - $s->onBefore(new BeforeEvent($t)); - $this->assertEquals('foo', $t->request->getHeader('Expect')); - } - - public function testDoesAddExpectHeaderWhenSetToFalse() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->getConfig()->set('expect', false); - $t->request->setBody(Stream::factory('foo')); - $s->onBefore(new BeforeEvent($t)); - $this->assertFalse($t->request->hasHeader('Expect')); - } - - public function testDoesNotAddExpectHeaderBySize() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->getConfig()->set('expect', 10); - $t->request->setBody(Stream::factory('foo')); - $s->onBefore(new BeforeEvent($t)); - $this->assertFalse($t->request->hasHeader('Expect')); - } - - public function testAddsExpectHeaderForNonSeekable() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->setBody(new NoSeekStream(Stream::factory('foo'))); - $s->onBefore(new BeforeEvent($t)); - $this->assertTrue($t->request->hasHeader('Expect')); - } - - public function testRemovesContentLengthWhenSendingWithChunked() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->setBody(Stream::factory('foo')); - $t->request->setHeader('Transfer-Encoding', 'chunked'); - $s->onBefore(new BeforeEvent($t)); - $this->assertFalse($t->request->hasHeader('Content-Length')); - } - - public function testUsesProvidedContentLengthAndRemovesXferEncoding() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->setBody(Stream::factory('foo')); - $t->request->setHeader('Content-Length', '3'); - $t->request->setHeader('Transfer-Encoding', 'chunked'); - $s->onBefore(new BeforeEvent($t)); - $this->assertEquals(3, $t->request->getHeader('Content-Length')); - $this->assertFalse($t->request->hasHeader('Transfer-Encoding')); - } - - public function testSetsContentTypeIfPossibleFromStream() - { - $body = $this->getMockBody(); - $sub = new Prepare(); - $t = $this->getTrans(); - $t->request->setBody($body); - $sub->onBefore(new BeforeEvent($t)); - $this->assertEquals( - 'image/jpeg', - $t->request->getHeader('Content-Type') - ); - $this->assertEquals(4, $t->request->getHeader('Content-Length')); - } - - public function testDoesNotOverwriteExistingContentType() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->setBody($this->getMockBody()); - $t->request->setHeader('Content-Type', 'foo/baz'); - $s->onBefore(new BeforeEvent($t)); - $this->assertEquals( - 'foo/baz', - $t->request->getHeader('Content-Type') - ); - } - - public function testSetsContentLengthIfPossible() - { - $s = new Prepare(); - $t = $this->getTrans(); - $t->request->setBody($this->getMockBody()); - $s->onBefore(new BeforeEvent($t)); - $this->assertEquals(4, $t->request->getHeader('Content-Length')); - } - - public function testSetsTransferEncodingChunkedIfNeeded() - { - $r = new Request('PUT', '/'); - $s = $this->getMockBuilder('GuzzleHttp\Stream\StreamInterface') - ->setMethods(['getSize']) - ->getMockForAbstractClass(); - $s->expects($this->exactly(2)) - ->method('getSize') - ->will($this->returnValue(null)); - $r->setBody($s); - $t = $this->getTrans($r); - $s = new Prepare(); - $s->onBefore(new BeforeEvent($t)); - $this->assertEquals('chunked', $r->getHeader('Transfer-Encoding')); - } - - public function testContentLengthIntegrationTest() - { - Server::flush(); - Server::enqueue([new Response(200)]); - $client = new Client(['base_url' => Server::$url]); - $this->assertEquals(200, $client->put('/', [ - 'body' => 'test' - ])->getStatusCode()); - $request = Server::received(true)[0]; - $this->assertEquals('PUT', $request->getMethod()); - $this->assertEquals('4', $request->getHeader('Content-Length')); - $this->assertEquals('test', (string) $request->getBody()); - } - - private function getTrans($request = null) - { - return new Transaction( - new Client(), - $request ?: new Request('PUT', '/') - ); - } - - /** - * @return \GuzzleHttp\Stream\StreamInterface - */ - private function getMockBody() - { - $s = $this->getMockBuilder('GuzzleHttp\Stream\MetadataStreamInterface') - ->setMethods(['getMetadata', 'getSize']) - ->getMockForAbstractClass(); - $s->expects($this->any()) - ->method('getMetadata') - ->with('uri') - ->will($this->returnValue('/foo/baz/bar.jpg')); - $s->expects($this->exactly(2)) - ->method('getSize') - ->will($this->returnValue(4)); - - return $s; - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/Subscriber/RedirectTest.php b/vendor/guzzlehttp/guzzle/tests/Subscriber/RedirectTest.php deleted file mode 100644 index bd12af75..00000000 --- a/vendor/guzzlehttp/guzzle/tests/Subscriber/RedirectTest.php +++ /dev/null @@ -1,302 +0,0 @@ -addMultiple([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect1\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect2\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ]); - - $client = new Client(['base_url' => 'http://test.com']); - $client->getEmitter()->attach($history); - $client->getEmitter()->attach($mock); - - $request = $client->createRequest('GET', '/foo'); - // Ensure "end" is called only once - $called = 0; - $request->getEmitter()->on('end', function () use (&$called) { - $called++; - }); - $response = $client->send($request); - - $this->assertEquals(200, $response->getStatusCode()); - $this->assertContains('/redirect2', $response->getEffectiveUrl()); - - // Ensure that two requests were sent - $requests = $history->getRequests(true); - - $this->assertEquals('/foo', $requests[0]->getPath()); - $this->assertEquals('GET', $requests[0]->getMethod()); - $this->assertEquals('/redirect1', $requests[1]->getPath()); - $this->assertEquals('GET', $requests[1]->getMethod()); - $this->assertEquals('/redirect2', $requests[2]->getPath()); - $this->assertEquals('GET', $requests[2]->getMethod()); - - $this->assertEquals(1, $called); - } - - /** - * @expectedException \GuzzleHttp\Exception\TooManyRedirectsException - * @expectedExceptionMessage Will not follow more than - */ - public function testCanLimitNumberOfRedirects() - { - $mock = new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect1\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect2\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect3\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect4\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect5\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect6\r\nContent-Length: 0\r\n\r\n" - ]); - $client = new Client(); - $client->getEmitter()->attach($mock); - $client->get('http://www.example.com/foo'); - } - - public function testDefaultBehaviorIsToRedirectWithGetForEntityEnclosingRequests() - { - $h = new History(); - $mock = new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ]); - $client = new Client(); - $client->getEmitter()->attach($mock); - $client->getEmitter()->attach($h); - $client->post('http://test.com/foo', [ - 'headers' => ['X-Baz' => 'bar'], - 'body' => 'testing' - ]); - - $requests = $h->getRequests(true); - $this->assertEquals('POST', $requests[0]->getMethod()); - $this->assertEquals('GET', $requests[1]->getMethod()); - $this->assertEquals('bar', (string) $requests[1]->getHeader('X-Baz')); - $this->assertEquals('GET', $requests[2]->getMethod()); - } - - public function testCanRedirectWithStrictRfcCompliance() - { - $h = new History(); - $mock = new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ]); - $client = new Client(['base_url' => 'http://test.com']); - $client->getEmitter()->attach($mock); - $client->getEmitter()->attach($h); - $client->post('/foo', [ - 'headers' => ['X-Baz' => 'bar'], - 'body' => 'testing', - 'allow_redirects' => ['max' => 10, 'strict' => true] - ]); - - $requests = $h->getRequests(true); - $this->assertEquals('POST', $requests[0]->getMethod()); - $this->assertEquals('POST', $requests[1]->getMethod()); - $this->assertEquals('bar', (string) $requests[1]->getHeader('X-Baz')); - $this->assertEquals('POST', $requests[2]->getMethod()); - } - - public function testRewindsStreamWhenRedirectingIfNeeded() - { - $h = new History(); - $mock = new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ]); - $client = new Client(['base_url' => 'http://test.com']); - $client->getEmitter()->attach($mock); - $client->getEmitter()->attach($h); - - $body = $this->getMockBuilder('GuzzleHttp\Stream\StreamInterface') - ->setMethods(['seek', 'read', 'eof', 'tell']) - ->getMockForAbstractClass(); - $body->expects($this->once())->method('tell')->will($this->returnValue(1)); - $body->expects($this->once())->method('seek')->will($this->returnValue(true)); - $body->expects($this->any())->method('eof')->will($this->returnValue(true)); - $body->expects($this->any())->method('read')->will($this->returnValue('foo')); - $client->post('/foo', [ - 'body' => $body, - 'allow_redirects' => ['max' => 5, 'strict' => true] - ]); - } - - /** - * @expectedException \GuzzleHttp\Exception\CouldNotRewindStreamException - * @expectedExceptionMessage Unable to rewind the non-seekable request body after redirecting - */ - public function testThrowsExceptionWhenStreamCannotBeRewound() - { - $h = new History(); - $mock = new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ]); - $client = new Client(); - $client->getEmitter()->attach($mock); - $client->getEmitter()->attach($h); - - $body = $this->getMockBuilder('GuzzleHttp\Stream\StreamInterface') - ->setMethods(['seek', 'read', 'eof', 'tell']) - ->getMockForAbstractClass(); - $body->expects($this->once())->method('tell')->will($this->returnValue(1)); - $body->expects($this->once())->method('seek')->will($this->returnValue(false)); - $body->expects($this->any())->method('eof')->will($this->returnValue(true)); - $body->expects($this->any())->method('read')->will($this->returnValue('foo')); - $client->post('http://example.com/foo', [ - 'body' => $body, - 'allow_redirects' => ['max' => 10, 'strict' => true] - ]); - } - - public function testRedirectsCanBeDisabledPerRequest() - { - $client = new Client(['base_url' => 'http://test.com']); - $client->getEmitter()->attach(new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ])); - $response = $client->put('/', ['body' => 'test', 'allow_redirects' => false]); - $this->assertEquals(301, $response->getStatusCode()); - } - - public function testCanRedirectWithNoLeadingSlashAndQuery() - { - $h = new History(); - $client = new Client(['base_url' => 'http://www.foo.com']); - $client->getEmitter()->attach(new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect?foo=bar\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ])); - $client->getEmitter()->attach($h); - $client->get('?foo=bar'); - $requests = $h->getRequests(true); - $this->assertEquals('http://www.foo.com?foo=bar', $requests[0]->getUrl()); - $this->assertEquals('http://www.foo.com/redirect?foo=bar', $requests[1]->getUrl()); - } - - public function testHandlesRedirectsWithSpacesProperly() - { - $client = new Client(['base_url' => 'http://www.foo.com']); - $client->getEmitter()->attach(new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect 1\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n" - ])); - $h = new History(); - $client->getEmitter()->attach($h); - $client->get('/foo'); - $reqs = $h->getRequests(true); - $this->assertEquals('/redirect%201', $reqs[1]->getResource()); - } - - public function testAddsRefererWhenPossible() - { - $client = new Client(['base_url' => 'http://www.foo.com']); - $client->getEmitter()->attach(new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /bar\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n" - ])); - $h = new History(); - $client->getEmitter()->attach($h); - $client->get('/foo', ['allow_redirects' => ['max' => 5, 'referer' => true]]); - $reqs = $h->getRequests(true); - $this->assertEquals('http://www.foo.com/foo', $reqs[1]->getHeader('Referer')); - } - - public function testDoesNotAddRefererWhenChangingProtocols() - { - $client = new Client(['base_url' => 'https://www.foo.com']); - $client->getEmitter()->attach(new Mock([ - "HTTP/1.1 301 Moved Permanently\r\n" - . "Location: http://www.foo.com/foo\r\n" - . "Content-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n" - ])); - $h = new History(); - $client->getEmitter()->attach($h); - $client->get('/foo', ['allow_redirects' => ['max' => 5, 'referer' => true]]); - $reqs = $h->getRequests(true); - $this->assertFalse($reqs[1]->hasHeader('Referer')); - } - - public function testRedirectsWithGetOn303() - { - $h = new History(); - $mock = new Mock([ - "HTTP/1.1 303 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n", - ]); - $client = new Client(); - $client->getEmitter()->attach($mock); - $client->getEmitter()->attach($h); - $client->post('http://test.com/foo', ['body' => 'testing']); - $requests = $h->getRequests(true); - $this->assertEquals('POST', $requests[0]->getMethod()); - $this->assertEquals('GET', $requests[1]->getMethod()); - } - - public function testRelativeLinkBasedLatestRequest() - { - $client = new Client(['base_url' => 'http://www.foo.com']); - $client->getEmitter()->attach(new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: http://www.bar.com\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n" - ])); - $response = $client->get('/'); - $this->assertEquals( - 'http://www.bar.com/redirect', - $response->getEffectiveUrl() - ); - } - - public function testUpperCaseScheme() - { - $client = new Client(['base_url' => 'http://www.foo.com']); - $client->getEmitter()->attach(new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: HTTP://www.bar.com\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n" - ])); - $response = $client->get('/'); - $this->assertEquals( - 'http://www.bar.com', - $response->getEffectiveUrl() - ); - } - - /** - * @expectedException \GuzzleHttp\Exception\BadResponseException - * @expectedExceptionMessage Redirect URL, https://foo.com/redirect2, does not use one of the allowed redirect protocols: http - */ - public function testThrowsWhenRedirectingToInvalidUrlProtocol() - { - $mock = new Mock([ - "HTTP/1.1 301 Moved Permanently\r\nLocation: /redirect1\r\nContent-Length: 0\r\n\r\n", - "HTTP/1.1 301 Moved Permanently\r\nLocation: https://foo.com/redirect2\r\nContent-Length: 0\r\n\r\n" - ]); - $client = new Client(); - $client->getEmitter()->attach($mock); - $client->get('http://www.example.com/foo', [ - 'allow_redirects' => [ - 'protocols' => ['http'] - ] - ]); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/TransactionTest.php b/vendor/guzzlehttp/guzzle/tests/TransactionTest.php deleted file mode 100644 index 42965b1b..00000000 --- a/vendor/guzzlehttp/guzzle/tests/TransactionTest.php +++ /dev/null @@ -1,22 +0,0 @@ -assertSame($client, $t->client); - $this->assertSame($request, $t->request); - $response = new Response(200); - $t->response = $response; - $this->assertSame($response, $t->response); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/UriTemplateTest.php b/vendor/guzzlehttp/guzzle/tests/UriTemplateTest.php deleted file mode 100644 index 3f7a7f06..00000000 --- a/vendor/guzzlehttp/guzzle/tests/UriTemplateTest.php +++ /dev/null @@ -1,202 +0,0 @@ - 'value', - 'hello' => 'Hello World!', - 'empty' => '', - 'path' => '/foo/bar', - 'x' => '1024', - 'y' => '768', - 'null' => null, - 'list' => array('red', 'green', 'blue'), - 'keys' => array( - "semi" => ';', - "dot" => '.', - "comma" => ',' - ), - 'empty_keys' => array(), - ); - - return array_map(function ($t) use ($params) { - $t[] = $params; - return $t; - }, array( - array('foo', 'foo'), - array('{var}', 'value'), - array('{hello}', 'Hello%20World%21'), - array('{+var}', 'value'), - array('{+hello}', 'Hello%20World!'), - array('{+path}/here', '/foo/bar/here'), - array('here?ref={+path}', 'here?ref=/foo/bar'), - array('X{#var}', 'X#value'), - array('X{#hello}', 'X#Hello%20World!'), - array('map?{x,y}', 'map?1024,768'), - array('{x,hello,y}', '1024,Hello%20World%21,768'), - array('{+x,hello,y}', '1024,Hello%20World!,768'), - array('{+path,x}/here', '/foo/bar,1024/here'), - array('{#x,hello,y}', '#1024,Hello%20World!,768'), - array('{#path,x}/here', '#/foo/bar,1024/here'), - array('X{.var}', 'X.value'), - array('X{.x,y}', 'X.1024.768'), - array('{/var}', '/value'), - array('{/var,x}/here', '/value/1024/here'), - array('{;x,y}', ';x=1024;y=768'), - array('{;x,y,empty}', ';x=1024;y=768;empty'), - array('{?x,y}', '?x=1024&y=768'), - array('{?x,y,empty}', '?x=1024&y=768&empty='), - array('?fixed=yes{&x}', '?fixed=yes&x=1024'), - array('{&x,y,empty}', '&x=1024&y=768&empty='), - array('{var:3}', 'val'), - array('{var:30}', 'value'), - array('{list}', 'red,green,blue'), - array('{list*}', 'red,green,blue'), - array('{keys}', 'semi,%3B,dot,.,comma,%2C'), - array('{keys*}', 'semi=%3B,dot=.,comma=%2C'), - array('{+path:6}/here', '/foo/b/here'), - array('{+list}', 'red,green,blue'), - array('{+list*}', 'red,green,blue'), - array('{+keys}', 'semi,;,dot,.,comma,,'), - array('{+keys*}', 'semi=;,dot=.,comma=,'), - array('{#path:6}/here', '#/foo/b/here'), - array('{#list}', '#red,green,blue'), - array('{#list*}', '#red,green,blue'), - array('{#keys}', '#semi,;,dot,.,comma,,'), - array('{#keys*}', '#semi=;,dot=.,comma=,'), - array('X{.var:3}', 'X.val'), - array('X{.list}', 'X.red,green,blue'), - array('X{.list*}', 'X.red.green.blue'), - array('X{.keys}', 'X.semi,%3B,dot,.,comma,%2C'), - array('X{.keys*}', 'X.semi=%3B.dot=..comma=%2C'), - array('{/var:1,var}', '/v/value'), - array('{/list}', '/red,green,blue'), - array('{/list*}', '/red/green/blue'), - array('{/list*,path:4}', '/red/green/blue/%2Ffoo'), - array('{/keys}', '/semi,%3B,dot,.,comma,%2C'), - array('{/keys*}', '/semi=%3B/dot=./comma=%2C'), - array('{;hello:5}', ';hello=Hello'), - array('{;list}', ';list=red,green,blue'), - array('{;list*}', ';list=red;list=green;list=blue'), - array('{;keys}', ';keys=semi,%3B,dot,.,comma,%2C'), - array('{;keys*}', ';semi=%3B;dot=.;comma=%2C'), - array('{?var:3}', '?var=val'), - array('{?list}', '?list=red,green,blue'), - array('{?list*}', '?list=red&list=green&list=blue'), - array('{?keys}', '?keys=semi,%3B,dot,.,comma,%2C'), - array('{?keys*}', '?semi=%3B&dot=.&comma=%2C'), - array('{&var:3}', '&var=val'), - array('{&list}', '&list=red,green,blue'), - array('{&list*}', '&list=red&list=green&list=blue'), - array('{&keys}', '&keys=semi,%3B,dot,.,comma,%2C'), - array('{&keys*}', '&semi=%3B&dot=.&comma=%2C'), - array('{.null}', ''), - array('{.null,var}', '.value'), - array('X{.empty_keys*}', 'X'), - array('X{.empty_keys}', 'X'), - // Test that missing expansions are skipped - array('test{&missing*}', 'test'), - // Test that multiple expansions can be set - array('http://{var}/{var:2}{?keys*}', 'http://value/va?semi=%3B&dot=.&comma=%2C'), - // Test more complex query string stuff - array('http://www.test.com{+path}{?var,keys*}', 'http://www.test.com/foo/bar?var=value&semi=%3B&dot=.&comma=%2C') - )); - } - - /** - * @dataProvider templateProvider - */ - public function testExpandsUriTemplates($template, $expansion, $params) - { - $uri = new UriTemplate($template); - $this->assertEquals($expansion, $uri->expand($template, $params)); - } - - public function expressionProvider() - { - return array( - array( - '{+var*}', array( - 'operator' => '+', - 'values' => array( - array('value' => 'var', 'modifier' => '*') - ) - ), - ), - array( - '{?keys,var,val}', array( - 'operator' => '?', - 'values' => array( - array('value' => 'keys', 'modifier' => ''), - array('value' => 'var', 'modifier' => ''), - array('value' => 'val', 'modifier' => '') - ) - ), - ), - array( - '{+x,hello,y}', array( - 'operator' => '+', - 'values' => array( - array('value' => 'x', 'modifier' => ''), - array('value' => 'hello', 'modifier' => ''), - array('value' => 'y', 'modifier' => '') - ) - ) - ) - ); - } - - /** - * @dataProvider expressionProvider - */ - public function testParsesExpressions($exp, $data) - { - $template = new UriTemplate($exp); - - // Access the config object - $class = new \ReflectionClass($template); - $method = $class->getMethod('parseExpression'); - $method->setAccessible(true); - - $exp = substr($exp, 1, -1); - $this->assertEquals($data, $method->invokeArgs($template, array($exp))); - } - - /** - * @ticket https://github.com/guzzle/guzzle/issues/90 - */ - public function testAllowsNestedArrayExpansion() - { - $template = new UriTemplate(); - - $result = $template->expand('http://example.com{+path}{/segments}{?query,data*,foo*}', array( - 'path' => '/foo/bar', - 'segments' => array('one', 'two'), - 'query' => 'test', - 'data' => array( - 'more' => array('fun', 'ice cream') - ), - 'foo' => array( - 'baz' => array( - 'bar' => 'fizz', - 'test' => 'buzz' - ), - 'bam' => 'boo' - ) - )); - - $this->assertEquals('http://example.com/foo/bar/one,two?query=test&more%5B0%5D=fun&more%5B1%5D=ice%20cream&baz%5Bbar%5D=fizz&baz%5Btest%5D=buzz&bam=boo', $result); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/UrlTest.php b/vendor/guzzlehttp/guzzle/tests/UrlTest.php deleted file mode 100644 index 22bf7e49..00000000 --- a/vendor/guzzlehttp/guzzle/tests/UrlTest.php +++ /dev/null @@ -1,364 +0,0 @@ -assertEquals('', (string) $url); - } - - public function testPortIsDeterminedFromScheme() - { - $this->assertEquals(80, Url::fromString('http://www.test.com/')->getPort()); - $this->assertEquals(443, Url::fromString('https://www.test.com/')->getPort()); - $this->assertEquals(21, Url::fromString('ftp://www.test.com/')->getPort()); - $this->assertEquals(8192, Url::fromString('http://www.test.com:8192/')->getPort()); - $this->assertEquals(null, Url::fromString('foo://www.test.com/')->getPort()); - } - - public function testRemovesDefaultPortWhenSettingScheme() - { - $url = Url::fromString('http://www.test.com/'); - $url->setPort(80); - $url->setScheme('https'); - $this->assertEquals(443, $url->getPort()); - } - - public function testCloneCreatesNewInternalObjects() - { - $u1 = Url::fromString('http://www.test.com/'); - $u2 = clone $u1; - $this->assertNotSame($u1->getQuery(), $u2->getQuery()); - } - - public function testValidatesUrlPartsInFactory() - { - $url = Url::fromString('/index.php'); - $this->assertEquals('/index.php', (string) $url); - $this->assertFalse($url->isAbsolute()); - - $url = 'http://michael:test@test.com:80/path/123?q=abc#test'; - $u = Url::fromString($url); - $this->assertEquals('http://michael:test@test.com/path/123?q=abc#test', (string) $u); - $this->assertTrue($u->isAbsolute()); - } - - public function testAllowsFalsyUrlParts() - { - $url = Url::fromString('http://a:50/0?0#0'); - $this->assertSame('a', $url->getHost()); - $this->assertEquals(50, $url->getPort()); - $this->assertSame('/0', $url->getPath()); - $this->assertEquals('0', (string) $url->getQuery()); - $this->assertSame('0', $url->getFragment()); - $this->assertEquals('http://a:50/0?0#0', (string) $url); - - $url = Url::fromString(''); - $this->assertSame('', (string) $url); - - $url = Url::fromString('0'); - $this->assertSame('0', (string) $url); - } - - public function testBuildsRelativeUrlsWithFalsyParts() - { - $url = Url::buildUrl(['path' => '/0']); - $this->assertSame('/0', $url); - - $url = Url::buildUrl(['path' => '0']); - $this->assertSame('0', $url); - - $url = Url::buildUrl(['host' => '', 'path' => '0']); - $this->assertSame('0', $url); - } - - public function testUrlStoresParts() - { - $url = Url::fromString('http://test:pass@www.test.com:8081/path/path2/?a=1&b=2#fragment'); - $this->assertEquals('http', $url->getScheme()); - $this->assertEquals('test', $url->getUsername()); - $this->assertEquals('pass', $url->getPassword()); - $this->assertEquals('www.test.com', $url->getHost()); - $this->assertEquals(8081, $url->getPort()); - $this->assertEquals('/path/path2/', $url->getPath()); - $this->assertEquals('fragment', $url->getFragment()); - $this->assertEquals('a=1&b=2', (string) $url->getQuery()); - - $this->assertEquals(array( - 'fragment' => 'fragment', - 'host' => 'www.test.com', - 'pass' => 'pass', - 'path' => '/path/path2/', - 'port' => 8081, - 'query' => 'a=1&b=2', - 'scheme' => 'http', - 'user' => 'test' - ), $url->getParts()); - } - - public function testHandlesPathsCorrectly() - { - $url = Url::fromString('http://www.test.com'); - $this->assertEquals('', $url->getPath()); - $url->setPath('test'); - $this->assertEquals('test', $url->getPath()); - - $url->setPath('/test/123/abc'); - $this->assertEquals(array('', 'test', '123', 'abc'), $url->getPathSegments()); - - $parts = parse_url('http://www.test.com/test'); - $parts['path'] = ''; - $this->assertEquals('http://www.test.com', Url::buildUrl($parts)); - $parts['path'] = 'test'; - $this->assertEquals('http://www.test.com/test', Url::buildUrl($parts)); - } - - public function testAddsQueryIfPresent() - { - $this->assertEquals('?foo=bar', Url::buildUrl(array( - 'query' => 'foo=bar' - ))); - } - - public function testAddsToPath() - { - // Does nothing here - $url = Url::fromString('http://e.com/base?a=1'); - $url->addPath(false); - $this->assertEquals('http://e.com/base?a=1', $url); - $url = Url::fromString('http://e.com/base?a=1'); - $url->addPath(''); - $this->assertEquals('http://e.com/base?a=1', $url); - $url = Url::fromString('http://e.com/base?a=1'); - $url->addPath('/'); - $this->assertEquals('http://e.com/base?a=1', $url); - $url = Url::fromString('http://e.com/base'); - $url->addPath('0'); - $this->assertEquals('http://e.com/base/0', $url); - - $url = Url::fromString('http://e.com/base?a=1'); - $url->addPath('relative'); - $this->assertEquals('http://e.com/base/relative?a=1', $url); - $url = Url::fromString('http://e.com/base?a=1'); - $url->addPath('/relative'); - $this->assertEquals('http://e.com/base/relative?a=1', $url); - } - - /** - * URL combination data provider - * - * @return array - */ - public function urlCombineDataProvider() - { - return [ - // Specific test cases - ['http://www.example.com/', 'http://www.example.com/', 'http://www.example.com/'], - ['http://www.example.com/path', '/absolute', 'http://www.example.com/absolute'], - ['http://www.example.com/path', '/absolute?q=2', 'http://www.example.com/absolute?q=2'], - ['http://www.example.com/', '?q=1', 'http://www.example.com/?q=1'], - ['http://www.example.com/path', 'http://test.com', 'http://test.com'], - ['http://www.example.com:8080/path', 'http://test.com', 'http://test.com'], - ['http://www.example.com:8080/path', '?q=2#abc', 'http://www.example.com:8080/path?q=2#abc'], - ['http://www.example.com/path', 'http://u:a@www.example.com/', 'http://u:a@www.example.com/'], - ['/path?q=2', 'http://www.test.com/', 'http://www.test.com/path?q=2'], - ['http://api.flickr.com/services/', 'http://www.flickr.com/services/oauth/access_token', 'http://www.flickr.com/services/oauth/access_token'], - ['https://www.example.com/path', '//foo.com/abc', 'https://foo.com/abc'], - ['https://www.example.com/0/', 'relative/foo', 'https://www.example.com/0/relative/foo'], - ['', '0', '0'], - // RFC 3986 test cases - [self::RFC3986_BASE, 'g:h', 'g:h'], - [self::RFC3986_BASE, 'g', 'http://a/b/c/g'], - [self::RFC3986_BASE, './g', 'http://a/b/c/g'], - [self::RFC3986_BASE, 'g/', 'http://a/b/c/g/'], - [self::RFC3986_BASE, '/g', 'http://a/g'], - [self::RFC3986_BASE, '//g', 'http://g'], - [self::RFC3986_BASE, '?y', 'http://a/b/c/d;p?y'], - [self::RFC3986_BASE, 'g?y', 'http://a/b/c/g?y'], - [self::RFC3986_BASE, '#s', 'http://a/b/c/d;p?q#s'], - [self::RFC3986_BASE, 'g#s', 'http://a/b/c/g#s'], - [self::RFC3986_BASE, 'g?y#s', 'http://a/b/c/g?y#s'], - [self::RFC3986_BASE, ';x', 'http://a/b/c/;x'], - [self::RFC3986_BASE, 'g;x', 'http://a/b/c/g;x'], - [self::RFC3986_BASE, 'g;x?y#s', 'http://a/b/c/g;x?y#s'], - [self::RFC3986_BASE, '', self::RFC3986_BASE], - [self::RFC3986_BASE, '.', 'http://a/b/c/'], - [self::RFC3986_BASE, './', 'http://a/b/c/'], - [self::RFC3986_BASE, '..', 'http://a/b/'], - [self::RFC3986_BASE, '../', 'http://a/b/'], - [self::RFC3986_BASE, '../g', 'http://a/b/g'], - [self::RFC3986_BASE, '../..', 'http://a/'], - [self::RFC3986_BASE, '../../', 'http://a/'], - [self::RFC3986_BASE, '../../g', 'http://a/g'], - [self::RFC3986_BASE, '../../../g', 'http://a/g'], - [self::RFC3986_BASE, '../../../../g', 'http://a/g'], - [self::RFC3986_BASE, '/./g', 'http://a/g'], - [self::RFC3986_BASE, '/../g', 'http://a/g'], - [self::RFC3986_BASE, 'g.', 'http://a/b/c/g.'], - [self::RFC3986_BASE, '.g', 'http://a/b/c/.g'], - [self::RFC3986_BASE, 'g..', 'http://a/b/c/g..'], - [self::RFC3986_BASE, '..g', 'http://a/b/c/..g'], - [self::RFC3986_BASE, './../g', 'http://a/b/g'], - [self::RFC3986_BASE, 'foo////g', 'http://a/b/c/foo////g'], - [self::RFC3986_BASE, './g/.', 'http://a/b/c/g/'], - [self::RFC3986_BASE, 'g/./h', 'http://a/b/c/g/h'], - [self::RFC3986_BASE, 'g/../h', 'http://a/b/c/h'], - [self::RFC3986_BASE, 'g;x=1/./y', 'http://a/b/c/g;x=1/y'], - [self::RFC3986_BASE, 'g;x=1/../y', 'http://a/b/c/y'], - [self::RFC3986_BASE, 'http:g', 'http:g'], - ]; - } - - /** - * @dataProvider urlCombineDataProvider - */ - public function testCombinesUrls($a, $b, $c) - { - $this->assertEquals($c, (string) Url::fromString($a)->combine($b)); - } - - public function testHasGettersAndSetters() - { - $url = Url::fromString('http://www.test.com/'); - $url->setHost('example.com'); - $this->assertEquals('example.com', $url->getHost()); - $url->setPort(8080); - $this->assertEquals('8080', $url->getPort()); - $url->setPath('/foo/bar'); - $this->assertEquals('/foo/bar', $url->getPath()); - $url->setPassword('a'); - $this->assertEquals('a', $url->getPassword()); - $url->setUsername('b'); - $this->assertEquals('b', $url->getUsername()); - $url->setFragment('abc'); - $this->assertEquals('abc', $url->getFragment()); - $url->setScheme('https'); - $this->assertEquals('https', $url->getScheme()); - $url->setQuery('a=123'); - $this->assertEquals('a=123', (string) $url->getQuery()); - $this->assertEquals( - 'https://b:a@example.com:8080/foo/bar?a=123#abc', - (string) $url - ); - $url->setQuery(new Query(['b' => 'boo'])); - $this->assertEquals('b=boo', $url->getQuery()); - $this->assertEquals( - 'https://b:a@example.com:8080/foo/bar?b=boo#abc', - (string) $url - ); - - $url->setQuery('a%20=bar!', true); - $this->assertEquals( - 'https://b:a@example.com:8080/foo/bar?a%20=bar!#abc', - (string) $url - ); - } - - public function testSetQueryAcceptsArray() - { - $url = Url::fromString('http://www.test.com'); - $url->setQuery(array('a' => 'b')); - $this->assertEquals('http://www.test.com?a=b', (string) $url); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testQueryMustBeValid() - { - $url = Url::fromString('http://www.test.com'); - $url->setQuery(false); - } - - public function testDefersParsingAndEncodingQueryUntilNecessary() - { - $url = Url::fromString('http://www.test.com'); - // Note that invalid characters are encoded. - $url->setQuery('foo#bar/', true); - $this->assertEquals('http://www.test.com?foo%23bar/', (string) $url); - $this->assertInternalType('string', $this->readAttribute($url, 'query')); - $this->assertEquals('foo%23bar%2F', (string) $url->getQuery()); - $this->assertInstanceOf('GuzzleHttp\Query', $this->readAttribute($url, 'query')); - } - - public function urlProvider() - { - return array( - array('/foo/..', '/'), - array('//foo//..', '//foo/'), - array('/foo//', '/foo//'), - array('/foo/../..', '/'), - array('/foo/../.', '/'), - array('/./foo/..', '/'), - array('/./foo', '/foo'), - array('/./foo/', '/foo/'), - array('*', '*'), - array('/foo', '/foo'), - array('/abc/123/../foo/', '/abc/foo/'), - array('/a/b/c/./../../g', '/a/g'), - array('/b/c/./../../g', '/g'), - array('/b/c/./../../g', '/g'), - array('/c/./../../g', '/g'), - array('/./../../g', '/g'), - array('foo', 'foo'), - ); - } - - /** - * @dataProvider urlProvider - */ - public function testRemoveDotSegments($path, $result) - { - $url = Url::fromString('http://www.example.com'); - $url->setPath($path); - $url->removeDotSegments(); - $this->assertEquals($result, $url->getPath()); - } - - public function testSettingHostWithPortModifiesPort() - { - $url = Url::fromString('http://www.example.com'); - $url->setHost('foo:8983'); - $this->assertEquals('foo', $url->getHost()); - $this->assertEquals(8983, $url->getPort()); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testValidatesUrlCanBeParsed() - { - Url::fromString('foo:////'); - } - - public function testConvertsSpecialCharsInPathWhenCastingToString() - { - $url = Url::fromString('http://foo.com/baz bar?a=b'); - $url->addPath('?'); - $this->assertEquals('http://foo.com/baz%20bar/%3F?a=b', (string) $url); - } - - public function testCorrectlyEncodesPathWithoutDoubleEncoding() - { - $url = Url::fromString('http://foo.com/baz%20 bar:boo/baz!'); - $this->assertEquals('/baz%20%20bar:boo/baz!', $url->getPath()); - } - - public function testLowercaseScheme() - { - $url = Url::fromString('HTTP://foo.com/'); - $this->assertEquals('http', $url->getScheme()); - $url->setScheme('HTTPS'); - $this->assertEquals('https', $url->getScheme()); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/UtilsTest.php b/vendor/guzzlehttp/guzzle/tests/UtilsTest.php deleted file mode 100644 index 10bdc545..00000000 --- a/vendor/guzzlehttp/guzzle/tests/UtilsTest.php +++ /dev/null @@ -1,40 +0,0 @@ -assertEquals( - 'foo/123', - Utils::uriTemplate('foo/{bar}', ['bar' => '123']) - ); - } - - public function noBodyProvider() - { - return [['get'], ['head'], ['delete']]; - } - - public function testJsonDecodes() - { - $this->assertTrue(Utils::jsonDecode('true')); - } - - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage Unable to parse JSON data: JSON_ERROR_SYNTAX - Syntax error, malformed JSON - */ - public function testJsonDecodesWithErrorMessages() - { - Utils::jsonDecode('!narf!'); - } - - public function testProvidesDefaultUserAgent() - { - $ua = Utils::getDefaultUserAgent(); - $this->assertEquals(1, preg_match('#^Guzzle/.+ curl/.+ PHP/.+$#', $ua)); - } -} diff --git a/vendor/guzzlehttp/guzzle/tests/bootstrap.php b/vendor/guzzlehttp/guzzle/tests/bootstrap.php deleted file mode 100644 index 8713f962..00000000 --- a/vendor/guzzlehttp/guzzle/tests/bootstrap.php +++ /dev/null @@ -1,11 +0,0 @@ - Server::$url]); - -$t = microtime(true); -for ($i = 0; $i < $total; $i++) { - $client->get('/guzzle-server/perf'); -} -$totalTime = microtime(true) - $t; -$perRequest = ($totalTime / $total) * 1000; -printf("Serial: %f (%f ms / request) %d total\n", - $totalTime, $perRequest, $total); - -// Create a generator used to yield batches of requests -$reqs = function () use ($client, $total) { - for ($i = 0; $i < $total; $i++) { - yield $client->createRequest('GET', '/guzzle-server/perf'); - } -}; - -$t = microtime(true); -Pool::send($client, $reqs(), ['parallel' => $parallel]); -$totalTime = microtime(true) - $t; -$perRequest = ($totalTime / $total) * 1000; -printf("Batch: %f (%f ms / request) %d total with %d in parallel\n", - $totalTime, $perRequest, $total, $parallel); - -$handler = new CurlMultiHandler(['max_handles' => $parallel]); -$client = new Client(['handler' => $handler, 'base_url' => Server::$url]); -$t = microtime(true); -for ($i = 0; $i < $total; $i++) { - $client->get('/guzzle-server/perf'); -} -unset($client); -$totalTime = microtime(true) - $t; -$perRequest = ($totalTime / $total) * 1000; -printf("Future: %f (%f ms / request) %d total\n", - $totalTime, $perRequest, $total); diff --git a/vendor/phpdocumentor/reflection-common/.gitignore b/vendor/phpdocumentor/reflection-common/.gitignore new file mode 100644 index 00000000..c56f6719 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/.gitignore @@ -0,0 +1,4 @@ +composer.phar +vendor/ +build/ + diff --git a/vendor/phpdocumentor/reflection-common/LICENSE b/vendor/phpdocumentor/reflection-common/LICENSE new file mode 100644 index 00000000..ed6926c1 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 phpDocumentor + +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/phpdocumentor/reflection-common/README.md b/vendor/phpdocumentor/reflection-common/README.md new file mode 100644 index 00000000..52b12bc0 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/README.md @@ -0,0 +1 @@ +# ReflectionCommon diff --git a/vendor/phpdocumentor/reflection-common/composer.json b/vendor/phpdocumentor/reflection-common/composer.json new file mode 100644 index 00000000..90eee0f0 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/composer.json @@ -0,0 +1,29 @@ +{ + "name": "phpdocumentor/reflection-common", + "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"], + "homepage": "http://www.phpdoc.org", + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "license": "MIT", + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "require": { + "php": ">=5.5" + }, + "autoload" : { + "psr-4" : { + "phpDocumentor\\Reflection\\": ["src"] + } + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/phpdocumentor/reflection-common/composer.lock b/vendor/phpdocumentor/reflection-common/composer.lock new file mode 100644 index 00000000..e01dc3c1 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/composer.lock @@ -0,0 +1,974 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "49ee00389e4ccd00d7e93a147103b2ab", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Doctrine\\Instantiator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ], + "time": "2014-10-13 12:58:55" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" + }, + { + "name": "phpspec/prophecy", + "version": "v1.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", + "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.0.2", + "phpdocumentor/reflection-docblock": "~2.0", + "sebastian/comparator": "~1.1" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "time": "2015-04-27 22:15:08" + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f", + "reference": "6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "~1.0", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "time": "2015-06-01 07:35:26" + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb", + "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "time": "2015-04-02 05:19:05" + }, + { + "name": "phpunit/php-text-template", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "Text/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "time": "2014-01-30 17:20:04" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "time": "2013-08-02 07:42:54" + }, + { + "name": "phpunit/php-token-stream", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "eab81d02569310739373308137284e0158424330" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330", + "reference": "eab81d02569310739373308137284e0158424330", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ], + "time": "2015-04-08 04:46:07" + }, + { + "name": "phpunit/phpunit", + "version": "4.6.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/816d12536a7a032adc3b68737f82cfbbf98b79c1", + "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "~1.3,>=1.3.1", + "phpunit/php-code-coverage": "~2.0,>=2.0.11", + "phpunit/php-file-iterator": "~1.4", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "~1.0", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.2", + "sebastian/exporter": "~1.2", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.6.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "time": "2015-05-29 06:00:03" + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7", + "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "~1.0,>=1.0.2", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "suggest": { + "ext-soap": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ], + "time": "2015-05-29 05:19:18" + }, + { + "name": "sebastian/comparator", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "time": "2015-01-29 16:28:08" + }, + { + "name": "sebastian/diff", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" + ], + "time": "2015-02-22 15:13:53" + }, + { + "name": "sebastian/environment", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2015-01-01 10:01:08" + }, + { + "name": "sebastian/exporter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "84839970d05254c73cde183a721c7af13aede943" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", + "reference": "84839970d05254c73cde183a721c7af13aede943", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2015-01-27 07:23:06" + }, + { + "name": "sebastian/global-state", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2014-10-06 09:23:50" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-01-24 09:48:32" + }, + { + "name": "sebastian/version", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", + "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "time": "2015-02-24 06:35:25" + }, + { + "name": "symfony/yaml", + "version": "v2.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/Yaml.git", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + } + }, + "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 Yaml Component", + "homepage": "https://symfony.com", + "time": "2015-05-02 15:21:08" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/vendor/phpdocumentor/reflection-common/phpunit.xml.dist b/vendor/phpdocumentor/reflection-common/phpunit.xml.dist new file mode 100644 index 00000000..31811501 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/phpunit.xml.dist @@ -0,0 +1,26 @@ + + + + + + ./tests/unit/ + + + + + src + + + + + + + + diff --git a/vendor/phpdocumentor/reflection-common/src/Element.php b/vendor/phpdocumentor/reflection-common/src/Element.php new file mode 100644 index 00000000..712e30e8 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/src/Element.php @@ -0,0 +1,32 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +/** + * Interface for files processed by the ProjectFactory + */ +interface File +{ + /** + * Returns the content of the file as a string. + * + * @return string + */ + public function getContents(); + + /** + * Returns md5 hash of the file. + * + * @return string + */ + public function md5(); + + /** + * Returns an relative path to the file. + * + * @return string + */ + public function path(); +} diff --git a/vendor/phpdocumentor/reflection-common/src/Fqsen.php b/vendor/phpdocumentor/reflection-common/src/Fqsen.php new file mode 100644 index 00000000..c7be3f15 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/src/Fqsen.php @@ -0,0 +1,78 @@ +fqsen = $fqsen; + + if (isset($matches[2])) { + $this->name = $matches[2]; + } else { + $matches = explode('\\', $fqsen); + $this->name = trim(end($matches), '()'); + } + } + + /** + * converts this class to string. + * + * @return string + */ + public function __toString() + { + return $this->fqsen; + } + + /** + * Returns the name of the element without path. + * + * @return string + */ + public function getName() + { + return $this->name; + } +} diff --git a/vendor/phpdocumentor/reflection-common/src/Location.php b/vendor/phpdocumentor/reflection-common/src/Location.php new file mode 100644 index 00000000..57603219 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/src/Location.php @@ -0,0 +1,57 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +/** + * The location where an element occurs within a file. + */ +final class Location +{ + /** @var int */ + private $lineNumber = 0; + + /** @var int */ + private $columnNumber = 0; + + /** + * Initializes the location for an element using its line number in the file and optionally the column number. + * + * @param int $lineNumber + * @param int $columnNumber + */ + public function __construct($lineNumber, $columnNumber = 0) + { + $this->lineNumber = $lineNumber; + $this->columnNumber = $columnNumber; + } + + /** + * Returns the line number that is covered by this location. + * + * @return integer + */ + public function getLineNumber() + { + return $this->lineNumber; + } + + /** + * Returns the column number (character position on a line) for this location object. + * + * @return integer + */ + public function getColumnNumber() + { + return $this->columnNumber; + } +} diff --git a/vendor/phpdocumentor/reflection-common/src/Project.php b/vendor/phpdocumentor/reflection-common/src/Project.php new file mode 100644 index 00000000..3ed1e393 --- /dev/null +++ b/vendor/phpdocumentor/reflection-common/src/Project.php @@ -0,0 +1,25 @@ +assertEquals($name, $instance->getName()); + } + + /** + * Data provider for ValidFormats tests. Contains a complete list from psr-5 draft. + * + * @return array + */ + public function validFqsenProvider() + { + return [ + ['\\', ''], + ['\My\Space', 'Space'], + ['\My\Space\myFunction()', 'myFunction'], + ['\My\Space\MY_CONSTANT', 'MY_CONSTANT'], + ['\My\Space\MY_CONSTANT2', 'MY_CONSTANT2'], + ['\My\Space\MyClass', 'MyClass'], + ['\My\Space\MyInterface', 'MyInterface'], + ['\My\Space\MyTrait', 'MyTrait'], + ['\My\Space\MyClass::myMethod()', 'myMethod'], + ['\My\Space\MyClass::$my_property', 'my_property'], + ['\My\Space\MyClass::MY_CONSTANT', 'MY_CONSTANT'], + ]; + } + + /** + * @param string $fqsen + * @covers ::__construct + * @dataProvider invalidFqsenProvider + * @expectedException \InvalidArgumentException + */ + public function testInValidFormats($fqsen) + { + new Fqsen($fqsen); + } + + /** + * Data provider for invalidFormats tests. Contains a complete list from psr-5 draft. + * + * @return array + */ + public function invalidFqsenProvider() + { + return [ + ['\My\*'], + ['\My\Space\.()'], + ['My\Space'], + ]; + } + + /** + * @covers ::__construct + * @covers ::__toString + */ + public function testToString() + { + $className = new Fqsen('\\phpDocumentor\\Application'); + + $this->assertEquals('\\phpDocumentor\\Application', (string)$className); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml b/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml new file mode 100644 index 00000000..5061d523 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml @@ -0,0 +1,32 @@ +before_commands: + - "composer install --no-dev --prefer-source" + +tools: + external_code_coverage: true + php_code_sniffer: + enabled: true + config: + standard: PSR2 + filter: + paths: ["src/*", "tests/*"] + php_cpd: + enabled: true + excluded_dirs: ["tests", "vendor"] + php_loc: + enabled: true + excluded_dirs: ["tests", "vendor"] + php_mess_detector: + enabled: true + config: + ruleset: phpmd.xml.dist + design_rules: { eval_expression: false } + filter: + paths: ["src/*"] + php_pdepend: + enabled: true + excluded_dirs: ["tests", "vendor"] + php_analyzer: + enabled: true + filter: + paths: ["src/*", "tests/*"] + sensiolabs_security_checker: true diff --git a/vendor/phpdocumentor/reflection-docblock/.travis.yml b/vendor/phpdocumentor/reflection-docblock/.travis.yml index eef782c4..920958df 100644 --- a/vendor/phpdocumentor/reflection-docblock/.travis.yml +++ b/vendor/phpdocumentor/reflection-docblock/.travis.yml @@ -1,28 +1,32 @@ language: php php: - - 5.3.3 - - 5.3 - - 5.4 - 5.5 - 5.6 + - 7.0 - hhvm - - hhvm-nightly + - nightly matrix: - allow_failures: - - php: hhvm - - php: hhvm-nightly + allow_failures: + - php: + - hhvm + - nightly + +cache: + directories: + - $HOME/.composer/cache script: - - vendor/bin/phpunit + - vendor/bin/phpunit --coverage-clover=coverage.clover -v + - composer update --no-interaction --prefer-source + - vendor/bin/phpunit -v before_script: - - sudo apt-get -qq update > /dev/null - - phpenv rehash > /dev/null - - composer selfupdate --quiet - - composer install --no-interaction --prefer-source --dev - - vendor/bin/phpunit - - composer update --no-interaction --prefer-source --dev + - composer install --no-interaction + +after_script: + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover coverage.clover notifications: irc: "irc.freenode.org#phpdocumentor" diff --git a/vendor/phpdocumentor/reflection-docblock/README.md b/vendor/phpdocumentor/reflection-docblock/README.md index 6405d1a1..a1984a15 100644 --- a/vendor/phpdocumentor/reflection-docblock/README.md +++ b/vendor/phpdocumentor/reflection-docblock/README.md @@ -24,34 +24,46 @@ You can install the component in the following ways: Usage ----- -The ReflectionDocBlock component is designed to work in an identical fashion to -PHP's own Reflection extension (http://php.net/manual/en/book.reflection.php). - -Parsing can be initiated by instantiating the -`\phpDocumentor\Reflection\DocBlock()` class and passing it a string containing -a DocBlock (including asterisks) or by passing an object supporting the -`getDocComment()` method. - -> *Examples of objects having the `getDocComment()` method are the -> `ReflectionClass` and the `ReflectionMethod` classes of the PHP -> Reflection extension* - -Example: - - $class = new ReflectionClass('MyClass'); - $phpdoc = new \phpDocumentor\Reflection\DocBlock($class); - -or - - $docblock = <<create($docComment); +``` + +The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock` +whose methods can be queried as shown in the following example. + +```php +// Should contain the summary for this DocBlock +$summary = $docblock->getSummary(); + +// Contains an object of type \phpDocumentor\Reflection\DocBlock\Description; +// you can either cast it to string or use the render method to get a string +// representation of the Description. +$description = $docblock->getDescription(); +``` + +> For more examples it would be best to review the scripts in the `/examples` +> folder. diff --git a/vendor/phpdocumentor/reflection-docblock/composer.json b/vendor/phpdocumentor/reflection-docblock/composer.json index 4dffa22d..85be2fdd 100644 --- a/vendor/phpdocumentor/reflection-docblock/composer.json +++ b/vendor/phpdocumentor/reflection-docblock/composer.json @@ -1,26 +1,28 @@ { "name": "phpdocumentor/reflection-docblock", + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "type": "library", "license": "MIT", "authors": [ - {"name": "Mike van Riel", "email": "mike.vanriel@naenius.com"} + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } ], "require": { - "php": ">=5.3.3" + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0@dev", + "phpdocumentor/type-resolver": "^0.2.0", + "webmozart/assert": "^1.0" }, "autoload": { - "psr-0": {"phpDocumentor": ["src/"]} - }, - "require-dev": { - "phpunit/phpunit": "~4.0" + "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]} }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" + "autoload-dev": { + "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]} }, - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^4.4" } } diff --git a/vendor/phpdocumentor/reflection-docblock/composer.lock b/vendor/phpdocumentor/reflection-docblock/composer.lock index 4c6a8bb7..b4da3c1b 100644 --- a/vendor/phpdocumentor/reflection-docblock/composer.lock +++ b/vendor/phpdocumentor/reflection-docblock/composer.lock @@ -1,46 +1,194 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "ea1734d11b8c878445c2c6e58de8b85f", - "packages": [], + "hash": "9dfabded4193c3fd2ec85874de3b2e3c", + "content-hash": "69f6ae6608b8524fa04ddb0264bbf091", + "packages": [ + { + "name": "phpdocumentor/reflection-common", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/9969bd1c9661a73fdab104df7dbf132639d5c4d8", + "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "time": "2015-06-12 22:21:38" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "0.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443", + "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443", + "shasum": "" + }, + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^0.9.4", + "phpunit/phpunit": "^5.2||^4.8.24" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "time": "2016-06-10 07:14:17" + }, + { + "name": "webmozart/assert", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/webmozart/assert.git", + "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozart/assert/zipball/b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab", + "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "time": "2015-05-12 15:19:25" + } + ], "packages-dev": [ { - "name": "ocramius/instantiator", - "version": "1.1.2", + "name": "doctrine/instantiator", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/Ocramius/Instantiator.git", - "reference": "a7abbb5fc9df6e7126af741dd6c140d1a7369435" + "url": "https://github.com/doctrine/instantiator.git", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/Instantiator/zipball/a7abbb5fc9df6e7126af741dd6c140d1a7369435", - "reference": "a7abbb5fc9df6e7126af741dd6c140d1a7369435", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", + "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", "shasum": "" }, "require": { - "ocramius/lazy-map": "1.0.*", - "php": "~5.3" + "php": ">=5.3,<8.0-DEV" }, "require-dev": { "athletic/athletic": "~0.1.8", "ext-pdo": "*", "ext-phar": "*", "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "2.0.*@ALPHA" + "squizlabs/php_codesniffer": "~2.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.0.x-dev" } }, "autoload": { - "psr-0": { - "Instantiator\\": "src" + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" } }, "notification-url": "https://packagist.org/downloads/", @@ -55,96 +203,148 @@ } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/Ocramius/Instantiator", + "homepage": "https://github.com/doctrine/instantiator", "keywords": [ "constructor", "instantiate" ], - "time": "2014-08-14 15:10:55" + "time": "2015-06-14 21:17:01" }, { - "name": "ocramius/lazy-map", - "version": "1.0.0", + "name": "hamcrest/hamcrest-php", + "version": "v1.2.2", "source": { "type": "git", - "url": "https://github.com/Ocramius/LazyMap.git", - "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752" + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Ocramius/LazyMap/zipball/7fe3d347f5e618bcea7d39345ff83f3651d8b752", - "reference": "7fe3d347f5e618bcea7d39345ff83f3651d8b752", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c", + "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.2" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" }, "require-dev": { - "athletic/athletic": "~0.1.6", - "phpmd/phpmd": "1.5.*", - "phpunit/phpunit": ">=3.7", - "satooshi/php-coveralls": "~0.6", - "squizlabs/php_codesniffer": "1.4.*" + "phpunit/php-file-iterator": "1.3.3", + "satooshi/php-coveralls": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "hamcrest" + ], + "files": [ + "hamcrest/Hamcrest.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2015-05-11 14:41:42" + }, + { + "name": "mockery/mockery", + "version": "0.9.4", + "source": { + "type": "git", + "url": "https://github.com/padraic/mockery.git", + "reference": "70bba85e4aabc9449626651f48b9018ede04f86b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/padraic/mockery/zipball/70bba85e4aabc9449626651f48b9018ede04f86b", + "reference": "70bba85e4aabc9449626651f48b9018ede04f86b", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~1.1", + "lib-pcre": ">=7.0", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "0.9.x-dev" } }, "autoload": { "psr-0": { - "LazyMap\\": "src" + "Mockery": "library/" } }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/", - "role": "Developer" + "name": "PĆ”draic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" } ], - "description": "A library that provides lazy instantiation logic for a map of objects", - "homepage": "https://github.com/Ocramius/LazyMap", + "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.", + "homepage": "http://github.com/padraic/mockery", "keywords": [ - "lazy", - "lazy instantiation", - "lazy loading", - "map", - "service location" + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" ], - "time": "2013-11-09 22:30:54" + "time": "2015-04-02 19:54:00" }, { "name": "phpunit/php-code-coverage", - "version": "2.0.10", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "6d196af48e8c100a3ae881940123e693da5a9217" + "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6d196af48e8c100a3ae881940123e693da5a9217", - "reference": "6d196af48e8c100a3ae881940123e693da5a9217", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44", + "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44", "shasum": "" }, "require": { "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3.1", - "phpunit/php-text-template": "~1.2.0", - "phpunit/php-token-stream": "~1.2.2", - "sebastian/environment": "~1.0.0", - "sebastian/version": "~1.0.3" + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "~1.0", + "sebastian/version": "~1.0" }, "require-dev": { "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4.0.14" + "phpunit/phpunit": "~4" }, "suggest": { "ext-dom": "*", @@ -154,7 +354,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.1.x-dev" } }, "autoload": { @@ -163,9 +363,6 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -183,7 +380,7 @@ "testing", "xunit" ], - "time": "2014-08-06 06:39:42" + "time": "2015-06-19 07:11:55" }, { "name": "phpunit/php-file-iterator", @@ -232,16 +429,16 @@ }, { "name": "phpunit/php-text-template", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a" + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", - "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", "shasum": "" }, "require": { @@ -250,20 +447,17 @@ "type": "library", "autoload": { "classmap": [ - "Text/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -272,20 +466,20 @@ "keywords": [ "template" ], - "time": "2014-01-30 17:20:04" + "time": "2015-06-21 13:50:34" }, { "name": "phpunit/php-timer", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", - "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d", + "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d", "shasum": "" }, "require": { @@ -294,13 +488,10 @@ "type": "library", "autoload": { "classmap": [ - "PHP/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -316,49 +507,48 @@ "keywords": [ "timer" ], - "time": "2013-08-02 07:42:54" + "time": "2015-06-13 07:35:30" }, { "name": "phpunit/php-token-stream", - "version": "1.2.2", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32" + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32", - "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9", + "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", "shasum": "" }, "require": { "ext-tokenizer": "*", "php": ">=5.3.3" }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2-dev" + "dev-master": "1.4-dev" } }, "autoload": { "classmap": [ - "PHP/" + "src/" ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], "description": "Wrapper around PHP's tokenizer extension.", @@ -366,20 +556,20 @@ "keywords": [ "tokenizer" ], - "time": "2014-03-03 05:10:30" + "time": "2015-06-19 03:43:16" }, { "name": "phpunit/phpunit", - "version": "4.2.2", + "version": "4.4.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a33fa68ece9f8c68589bfc2da8d2794e27b820bc" + "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a33fa68ece9f8c68589bfc2da8d2794e27b820bc", - "reference": "a33fa68ece9f8c68589bfc2da8d2794e27b820bc", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2e8580deebb7d1ac92ac878595e6bffe01069c2a", + "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a", "shasum": "" }, "require": { @@ -390,14 +580,16 @@ "ext-spl": "*", "php": ">=5.3.3", "phpunit/php-code-coverage": "~2.0", - "phpunit/php-file-iterator": "~1.3.1", + "phpunit/php-file-iterator": "~1.3.2", "phpunit/php-text-template": "~1.2", "phpunit/php-timer": "~1.0.2", - "phpunit/phpunit-mock-objects": "~2.2", + "phpunit/phpunit-mock-objects": "~2.3", "sebastian/comparator": "~1.0", "sebastian/diff": "~1.1", - "sebastian/environment": "~1.0", - "sebastian/exporter": "~1.0", + "sebastian/environment": "~1.1", + "sebastian/exporter": "~1.1", + "sebastian/global-state": "~1.0", + "sebastian/recursion-context": "~1.0", "sebastian/version": "~1.0", "symfony/yaml": "~2.0" }, @@ -410,7 +602,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2.x-dev" + "dev-master": "4.4.x-dev" } }, "autoload": { @@ -419,10 +611,6 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "", - "../../symfony/yaml/" - ], "license": [ "BSD-3-Clause" ], @@ -434,35 +622,35 @@ } ], "description": "The PHP Unit Testing framework.", - "homepage": "http://www.phpunit.de/", + "homepage": "https://phpunit.de/", "keywords": [ "phpunit", "testing", "xunit" ], - "time": "2014-08-18 05:12:30" + "time": "2015-01-27 16:06:15" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.2.0", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "42e589e08bc86e3e9bdf20d385e948347788505b" + "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/42e589e08bc86e3e9bdf20d385e948347788505b", - "reference": "42e589e08bc86e3e9bdf20d385e948347788505b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/92408bb1968a81b3217a6fdf6c1a198da83caa35", + "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35", "shasum": "" }, "require": { - "ocramius/instantiator": "~1.0", + "doctrine/instantiator": "~1.0,>=1.0.2", "php": ">=5.3.3", "phpunit/php-text-template": "~1.2" }, "require-dev": { - "phpunit/phpunit": "4.2.*@dev" + "phpunit/phpunit": "~4.4" }, "suggest": { "ext-soap": "*" @@ -470,7 +658,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2.x-dev" + "dev-master": "2.3.x-dev" } }, "autoload": { @@ -479,9 +667,6 @@ ] }, "notification-url": "https://packagist.org/downloads/", - "include-path": [ - "" - ], "license": [ "BSD-3-Clause" ], @@ -498,34 +683,34 @@ "mock", "xunit" ], - "time": "2014-08-02 13:50:58" + "time": "2015-06-11 15:55:48" }, { "name": "sebastian/comparator", - "version": "1.0.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2" + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", - "reference": "f7069ee51fa9fb6c038e16a9d0e3439f5449dcf2", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", + "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", "shasum": "" }, "require": { "php": ">=5.3.3", - "sebastian/diff": "~1.1", - "sebastian/exporter": "~1.0" + "sebastian/diff": "~1.2", + "sebastian/exporter": "~1.2" }, "require-dev": { - "phpunit/phpunit": "~4.1" + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -538,11 +723,6 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -554,6 +734,10 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -563,29 +747,32 @@ "compare", "equality" ], - "time": "2014-05-02 07:05:58" + "time": "2015-01-29 16:28:08" }, { "name": "sebastian/diff", - "version": "1.1.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d" + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", - "reference": "1e091702a5a38e6b4c1ba9ca816e3dd343df2e2d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", + "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", "shasum": "" }, "require": { "php": ">=5.3.3" }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "1.3-dev" } }, "autoload": { @@ -598,14 +785,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - }, { "name": "Kore Nordmann", "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" } ], "description": "Diff implementation", @@ -613,32 +799,32 @@ "keywords": [ "diff" ], - "time": "2013-08-03 16:46:33" + "time": "2015-02-22 15:13:53" }, { "name": "sebastian/environment", - "version": "1.0.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a" + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/79517609ec01139cd7e9fded0dd7ce08c952ef6a", - "reference": "79517609ec01139cd7e9fded0dd7ce08c952ef6a", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", + "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { - "phpunit/phpunit": "4.0.*@dev" + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -653,8 +839,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], "description": "Provides functionality to handle HHVM/PHP environments", @@ -664,32 +849,33 @@ "environment", "hhvm" ], - "time": "2014-02-18 16:17:19" + "time": "2015-01-01 10:01:08" }, { "name": "sebastian/exporter", - "version": "1.0.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529" + "reference": "84839970d05254c73cde183a721c7af13aede943" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", - "reference": "1f9a98e6f5dfe0524cb8c6166f7c82f3e9ae1529", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", + "reference": "84839970d05254c73cde183a721c7af13aede943", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "sebastian/recursion-context": "~1.0" }, "require-dev": { - "phpunit/phpunit": "4.0.*@dev" + "phpunit/phpunit": "~4.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -702,11 +888,6 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -715,14 +896,17 @@ "name": "Volker Dusch", "email": "github@wallbash.com" }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net", - "role": "Lead" - }, { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], "description": "Provides the functionality to export PHP variables for visualization", @@ -731,20 +915,124 @@ "export", "exporter" ], - "time": "2014-02-16 08:26:31" + "time": "2015-01-27 07:23:06" + }, + { + "name": "sebastian/global-state", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "time": "2014-10-06 09:23:50" + }, + { + "name": "sebastian/recursion-context", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", + "reference": "3989662bbb30a29d20d9faa04a846af79b276252", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "time": "2015-01-24 09:48:32" }, { "name": "sebastian/version", - "version": "1.0.3", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43" + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", - "reference": "b6e1f0cf6b9e1ec409a0d3e2f2a5fb0998e36b43", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", + "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", "shasum": "" }, "type": "library", @@ -766,34 +1054,36 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2014-03-07 15:35:33" + "time": "2015-06-21 13:59:46" }, { "name": "symfony/yaml", - "version": "v2.5.3", - "target-dir": "Symfony/Component/Yaml", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f" + "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", - "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160", + "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/phpunit-bridge": "~2.7" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "2.7-dev" } }, "autoload": { - "psr-0": { + "psr-4": { "Symfony\\Component\\Yaml\\": "" } }, @@ -802,26 +1092,29 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony Yaml Component", - "homepage": "http://symfony.com", - "time": "2014-08-05 09:00:40" + "homepage": "https://symfony.com", + "time": "2015-06-10 15:30:22" } ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "phpdocumentor/reflection-common": 20 + }, "prefer-stable": false, + "prefer-lowest": false, "platform": { - "php": ">=5.3.3" + "php": ">=5.5" }, "platform-dev": [] } diff --git a/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php b/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php new file mode 100644 index 00000000..6d67dea4 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php @@ -0,0 +1,27 @@ +create($docComment); + +// Should contain the first line of the DocBlock +$summary = $docblock->getSummary(); + +// Contains an object of type Description; you can either cast it to string or use +// the render method to get a string representation of the Description. +// +// In subsequent examples we will be fiddling a bit more with the Description. +$description = $docblock->getDescription(); diff --git a/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php b/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php new file mode 100644 index 00000000..23995889 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php @@ -0,0 +1,24 @@ +create($docComment); + +// You can check if a DocBlock has one or more see tags +$hasSeeTag = $docblock->hasTag('see'); + +// Or we can get a complete list of all tags +$tags = $docblock->getTags(); + +// But we can also grab all tags of a specific type, such as `see` +$seeTags = $docblock->getTagsByName('see'); diff --git a/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php b/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php new file mode 100644 index 00000000..6bc10baf --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php @@ -0,0 +1,27 @@ +create($docComment); + +// Create the serializer that will reconstitute the DocBlock back to its original form. +$serializer = new Serializer(); + +// Reconstitution is performed by the `getDocComment()` method. +$reconstitutedDocComment = $serializer->getDocComment($docblock); + diff --git a/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php b/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php new file mode 100644 index 00000000..026d6069 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php @@ -0,0 +1,135 @@ + Important: Tag classes that act as Factories using the `create` method should implement the TagFactory interface. + */ +final class MyTag extends BaseTag implements StaticMethod +{ + /** + * A required property that is used by Formatters to reconstitute the complete tag line. + * + * @see Formatter + * + * @var string + */ + protected $name = 'my-tag'; + + /** + * The constructor for this Tag; this should contain all properties for this object. + * + * @param Description $description An example of how to add a Description to the tag; the Description is often + * an optional variable so passing null is allowed in this instance (though you can + * also construct an empty description object). + * + * @see BaseTag for the declaration of the description property and getDescription method. + */ + public function __construct(Description $description = null) + { + $this->description = $description; + } + + /** + * A static Factory that creates a new instance of the current Tag. + * + * In this example the MyTag tag can be created by passing a description text as $body. Because we have added + * a $descriptionFactory that is type-hinted as DescriptionFactory we can now construct a new Description object + * and pass that to the constructor. + * + * > You could directly instantiate a Description object here but that won't be parsed for inline tags and Types + * > won't be resolved. The DescriptionFactory will take care of those actions. + * + * The `create` method's interface states that this method only features a single parameter (`$body`) but the + * {@see TagFactory} will read the signature of this method and if it has more parameters then it will try + * to find declarations for it in the ServiceLocator of the TagFactory (see {@see TagFactory::$serviceLocator}). + * + * > Important: all properties following the `$body` should default to `null`, otherwise PHP will error because + * > it no longer matches the interface. This is why you often see the default tags check that an optional argument + * > is not null nonetheless. + * + * @param string $body + * @param DescriptionFactory $descriptionFactory + * @param Context|null $context The Context is used to resolve Types and FQSENs, although optional + * it is highly recommended to pass it. If you omit it then it is assumed that + * the DocBlock is in the global namespace and has no `use` statements. + * + * @see Tag for the interface declaration of the `create` method. + * @see Tag::create() for more information on this method's workings. + * + * @return MyTag + */ + public static function create($body, DescriptionFactory $descriptionFactory = null, Context $context = null) + { + Assert::string($body); + Assert::notNull($descriptionFactory); + + return new static($descriptionFactory->create($body, $context)); + } + + /** + * Returns a rendition of the original tag line. + * + * This method is used to reconstitute a DocBlock into its original form by the {@see Serializer}. It should + * feature all parts of the tag so that the serializer can put it back together. + * + * @return string + */ + public function __toString() + { + return (string)$this->description; + } +} + +$docComment = << MyTag::class]; + +// Do pass the list of custom tags to the Factory for the DocBlockFactory. +$factory = DocBlockFactory::createInstance($customTags); +// You can also add Tags later using `$factory->registerTagHandler()` with a tag name and Tag class name. + +// Create the DocBlock +$docblock = $factory->create($docComment); + +// Take a look: the $customTagObjects now contain an array with your newly added tag +$customTagObjects = $docblock->getTagsByName('my-tag'); + +// As an experiment: let's reconstitute the DocBlock and observe that because we added a __toString() method +// to the tag class that we can now also see it. +$serializer = new Serializer(); +$reconstitutedDocComment = $serializer->getDocComment($docblock); diff --git a/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php b/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php new file mode 100644 index 00000000..5ec772fe --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php @@ -0,0 +1,47 @@ +create($docComment); + +// Escaping is automatic so this happens in the DescriptionFactory. +$description = $docblock->getDescription(); + +// This is the rendition that we will receive of the Description. +$receivedDocComment = <<render(); diff --git a/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist b/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist new file mode 100644 index 00000000..9abf85cf --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + 40 + + + diff --git a/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist b/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist index f67ad2a2..3c2e9a37 100644 --- a/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist +++ b/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist @@ -1,14 +1,33 @@ - + - - ./tests/ + + ./tests/unit + + ./tests/integration + ./src/ + + ./vendor/ + + + + diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php new file mode 100644 index 00000000..39911406 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php @@ -0,0 +1,220 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Tag; +use Webmozart\Assert\Assert; + +final class DocBlock +{ + /** @var string The opening line for this docblock. */ + private $summary = ''; + + /** @var DocBlock\Description The actual description for this docblock. */ + private $description = null; + + /** @var Tag[] An array containing all the tags in this docblock; except inline. */ + private $tags = array(); + + /** @var Types\Context Information about the context of this DocBlock. */ + private $context = null; + + /** @var Location Information about the location of this DocBlock. */ + private $location = null; + + /** @var bool Is this DocBlock (the start of) a template? */ + private $isTemplateStart = false; + + /** @var bool Does this DocBlock signify the end of a DocBlock template? */ + private $isTemplateEnd = false; + + /** + * @param string $summary + * @param DocBlock\Description $description + * @param DocBlock\Tag[] $tags + * @param Types\Context $context The context in which the DocBlock occurs. + * @param Location $location The location within the file that this DocBlock occurs in. + * @param bool $isTemplateStart + * @param bool $isTemplateEnd + */ + public function __construct( + $summary = '', + DocBlock\Description $description = null, + array $tags = [], + Types\Context $context = null, + Location $location = null, + $isTemplateStart = false, + $isTemplateEnd = false + ) + { + Assert::string($summary); + Assert::boolean($isTemplateStart); + Assert::boolean($isTemplateEnd); + Assert::allIsInstanceOf($tags, Tag::class); + + $this->summary = $summary; + $this->description = $description ?: new DocBlock\Description(''); + foreach ($tags as $tag) { + $this->addTag($tag); + } + + $this->context = $context; + $this->location = $location; + + $this->isTemplateEnd = $isTemplateEnd; + $this->isTemplateStart = $isTemplateStart; + } + + /** + * @return string + */ + public function getSummary() + { + return $this->summary; + } + + /** + * @return DocBlock\Description + */ + public function getDescription() + { + return $this->description; + } + + /** + * Returns the current context. + * + * @return Types\Context + */ + public function getContext() + { + return $this->context; + } + + /** + * Returns the current location. + * + * @return Location + */ + public function getLocation() + { + return $this->location; + } + + /** + * Returns whether this DocBlock is the start of a Template section. + * + * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker + * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. + * + * An example of such an opening is: + * + * ``` + * /**#@+ + * * My DocBlock + * * / + * ``` + * + * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all + * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). + * + * @see self::isTemplateEnd() for the check whether a closing marker was provided. + * + * @return boolean + */ + public function isTemplateStart() + { + return $this->isTemplateStart; + } + + /** + * Returns whether this DocBlock is the end of a Template section. + * + * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. + * + * @return boolean + */ + public function isTemplateEnd() + { + return $this->isTemplateEnd; + } + + /** + * Returns the tags for this DocBlock. + * + * @return Tag[] + */ + public function getTags() + { + return $this->tags; + } + + /** + * Returns an array of tags matching the given name. If no tags are found + * an empty array is returned. + * + * @param string $name String to search by. + * + * @return Tag[] + */ + public function getTagsByName($name) + { + Assert::string($name); + + $result = array(); + + /** @var Tag $tag */ + foreach ($this->getTags() as $tag) { + if ($tag->getName() != $name) { + continue; + } + + $result[] = $tag; + } + + return $result; + } + + /** + * Checks if a tag of a certain type is present in this DocBlock. + * + * @param string $name Tag name to check for. + * + * @return bool + */ + public function hasTag($name) + { + Assert::string($name); + + /** @var Tag $tag */ + foreach ($this->getTags() as $tag) { + if ($tag->getName() == $name) { + return true; + } + } + + return false; + } + + /** + * Adds a tag to this DocBlock. + * + * @param Tag $tag The tag to add. + * + * @return void + */ + private function addTag(Tag $tag) + { + $this->tags[] = $tag; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php new file mode 100644 index 00000000..d1d7fc64 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php @@ -0,0 +1,103 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; +use Webmozart\Assert\Assert; + +/** + * Object representing to description for a DocBlock. + * + * A Description object can consist of plain text but can also include tags. A Description Formatter can then combine + * a body template with sprintf-style placeholders together with formatted tags in order to reconstitute a complete + * description text using the format that you would prefer. + * + * Because parsing a Description text can be a verbose process this is handled by the {@see DescriptionFactory}. It is + * thus recommended to use that to create a Description object, like this: + * + * $description = $descriptionFactory->create('This is a {@see Description}', $context); + * + * The description factory will interpret the given body and create a body template and list of tags from them, and pass + * that onto the constructor if this class. + * + * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace + * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial + * > type names and FQSENs. + * + * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this: + * + * $description = new Description( + * 'This is a %1$s', + * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ] + * ); + * + * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object + * is mainly responsible for rendering. + * + * @see DescriptionFactory to create a new Description. + * @see Description\Formatter for the formatting of the body and tags. + */ +class Description +{ + /** @var string */ + private $bodyTemplate; + + /** @var Tag[] */ + private $tags; + + /** + * Initializes a Description with its body (template) and a listing of the tags used in the body template. + * + * @param string $bodyTemplate + * @param Tag[] $tags + */ + public function __construct($bodyTemplate, array $tags = []) + { + Assert::string($bodyTemplate); + + $this->bodyTemplate = $bodyTemplate; + $this->tags = $tags; + } + + /** + * Renders this description as a string where the provided formatter will format the tags in the expected string + * format. + * + * @param Formatter|null $formatter + * + * @return string + */ + public function render(Formatter $formatter = null) + { + if ($formatter === null) { + $formatter = new PassthroughFormatter(); + } + + $tags = []; + foreach ($this->tags as $tag) { + $tags[] = '{' . $formatter->format($tag) . '}'; + } + return vsprintf($this->bodyTemplate, $tags); + } + + /** + * Returns a plain string representation of this description. + * + * @return string + */ + public function __toString() + { + return $this->render(); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php new file mode 100644 index 00000000..d59858b7 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php @@ -0,0 +1,191 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\Types\Context as TypeContext; + +/** + * Creates a new Description object given a body of text. + * + * Descriptions in phpDocumentor are somewhat complex entities as they can contain one or more tags inside their + * body that can be replaced with a readable output. The replacing is done by passing a Formatter object to the + * Description object's `render` method. + * + * In addition to the above does a Description support two types of escape sequences: + * + * 1. `{@}` to escape the `@` character to prevent it from being interpreted as part of a tag, i.e. `{{@}link}` + * 2. `{}` to escape the `}` character, this can be used if you want to use the `}` character in the description + * of an inline tag. + * + * If a body consists of multiple lines then this factory will also remove any superfluous whitespace at the beginning + * of each line while maintaining any indentation that is used. This will prevent formatting parsers from tripping + * over unexpected spaces as can be observed with tag descriptions. + */ +class DescriptionFactory +{ + /** @var TagFactory */ + private $tagFactory; + + /** + * Initializes this factory with the means to construct (inline) tags. + * + * @param TagFactory $tagFactory + */ + public function __construct(TagFactory $tagFactory) + { + $this->tagFactory = $tagFactory; + } + + /** + * Returns the parsed text of this description. + * + * @param string $contents + * @param TypeContext $context + * + * @return Description + */ + public function create($contents, TypeContext $context = null) + { + list($text, $tags) = $this->parse($this->lex($contents), $context); + + return new Description($text, $tags); + } + + /** + * Strips the contents from superfluous whitespace and splits the description into a series of tokens. + * + * @param string $contents + * + * @return string[] A series of tokens of which the description text is composed. + */ + private function lex($contents) + { + $contents = $this->removeSuperfluousStartingWhitespace($contents); + + // performance optimalization; if there is no inline tag, don't bother splitting it up. + if (strpos($contents, '{@') === false) { + return [$contents]; + } + + return preg_split( + '/\{ + # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally. + (?!@\}) + # We want to capture the whole tag line, but without the inline tag delimiters. + (\@ + # Match everything up to the next delimiter. + [^{}]* + # Nested inline tag content should not be captured, or it will appear in the result separately. + (?: + # Match nested inline tags. + (?: + # Because we did not catch the tag delimiters earlier, we must be explicit with them here. + # Notice that this also matches "{}", as a way to later introduce it as an escape sequence. + \{(?1)?\} + | + # Make sure we match hanging "{". + \{ + ) + # Match content after the nested inline tag. + [^{}]* + )* # If there are more inline tags, match them as well. We use "*" since there may not be any + # nested inline tags. + ) + \}/Sux', + $contents, + null, + PREG_SPLIT_DELIM_CAPTURE + ); + } + + /** + * Parses the stream of tokens in to a new set of tokens containing Tags. + * + * @param string[] $tokens + * @param TypeContext $context + * + * @return string[]|Tag[] + */ + private function parse($tokens, TypeContext $context) + { + $count = count($tokens); + $tagCount = 0; + $tags = []; + + for ($i = 1; $i < $count; $i += 2) { + $tags[] = $this->tagFactory->create($tokens[$i], $context); + $tokens[$i] = '%' . ++$tagCount . '$s'; + } + + //In order to allow "literal" inline tags, the otherwise invalid + //sequence "{@}" is changed to "@", and "{}" is changed to "}". + //See unit tests for examples. + for ($i = 0; $i < $count; $i += 2) { + $tokens[$i] = str_replace(['{@}', '{}'], ['@', '}'], $tokens[$i]); + } + + return [implode('', $tokens), $tags]; + } + + /** + * Removes the superfluous from a multi-line description. + * + * When a description has more than one line then it can happen that the second and subsequent lines have an + * additional indentation. This is commonly in use with tags like this: + * + * {@}since 1.1.0 This is an example + * description where we have an + * indentation in the second and + * subsequent lines. + * + * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent + * lines and this may cause rendering issues when, for example, using a Markdown converter. + * + * @param string $contents + * + * @return string + */ + private function removeSuperfluousStartingWhitespace($contents) + { + $lines = explode("\n", $contents); + + // if there is only one line then we don't have lines with superfluous whitespace and + // can use the contents as-is + if (count($lines) <= 1) { + return $contents; + } + + // determine how many whitespace characters need to be stripped + $startingSpaceCount = 9999999; + for ($i = 1; $i < count($lines); $i++) { + // lines with a no length do not count as they are not indented at all + if (strlen(trim($lines[$i])) === 0) { + continue; + } + + // determine the number of prefixing spaces by checking the difference in line length before and after + // an ltrim + $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i]))); + } + + // strip the number of spaces from each line + if ($startingSpaceCount > 0) { + for ($i = 1; $i < count($lines); $i++) { + $lines[$i] = substr($lines[$i], $startingSpaceCount); + } + } + + return implode("\n", $lines); + } + +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php new file mode 100644 index 00000000..3cc5dab3 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php @@ -0,0 +1,170 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Tags\Example; + +/** + * Class used to find an example file's location based on a given ExampleDescriptor. + */ +class ExampleFinder +{ + /** @var string */ + private $sourceDirectory = ''; + + /** @var string[] */ + private $exampleDirectories = array(); + + /** + * Attempts to find the example contents for the given descriptor. + * + * @param Example $example + * + * @return string + */ + public function find(Example $example) + { + $filename = $example->getFilePath(); + + $file = $this->getExampleFileContents($filename); + if (!$file) { + return "** File not found : {$filename} **"; + } + + return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount())); + } + + /** + * Registers the project's root directory where an 'examples' folder can be expected. + * + * @param string $directory + * + * @return void + */ + public function setSourceDirectory($directory = '') + { + $this->sourceDirectory = $directory; + } + + /** + * Returns the project's root directory where an 'examples' folder can be expected. + * + * @return string + */ + public function getSourceDirectory() + { + return $this->sourceDirectory; + } + + /** + * Registers a series of directories that may contain examples. + * + * @param string[] $directories + */ + public function setExampleDirectories(array $directories) + { + $this->exampleDirectories = $directories; + } + + /** + * Returns a series of directories that may contain examples. + * + * @return string[] + */ + public function getExampleDirectories() + { + return $this->exampleDirectories; + } + + /** + * Attempts to find the requested example file and returns its contents or null if no file was found. + * + * This method will try several methods in search of the given example file, the first one it encounters is + * returned: + * + * 1. Iterates through all examples folders for the given filename + * 2. Checks the source folder for the given filename + * 3. Checks the 'examples' folder in the current working directory for examples + * 4. Checks the path relative to the current working directory for the given filename + * + * @param string $filename + * + * @return string|null + */ + private function getExampleFileContents($filename) + { + $normalizedPath = null; + + foreach ($this->exampleDirectories as $directory) { + $exampleFileFromConfig = $this->constructExamplePath($directory, $filename); + if (is_readable($exampleFileFromConfig)) { + $normalizedPath = $exampleFileFromConfig; + break; + } + } + + if (!$normalizedPath) { + if (is_readable($this->getExamplePathFromSource($filename))) { + $normalizedPath = $this->getExamplePathFromSource($filename); + } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) { + $normalizedPath = $this->getExamplePathFromExampleDirectory($filename); + } elseif (is_readable($filename)) { + $normalizedPath = $filename; + } + } + + return $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : null; + } + + /** + * Get example filepath based on the example directory inside your project. + * + * @param string $file + * + * @return string + */ + private function getExamplePathFromExampleDirectory($file) + { + return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file; + } + + /** + * Returns a path to the example file in the given directory.. + * + * @param string $directory + * @param string $file + * + * @return string + */ + private function constructExamplePath($directory, $file) + { + return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file; + } + + /** + * Get example filepath based on sourcecode. + * + * @param string $file + * + * @return string + */ + private function getExamplePathFromSource($file) + { + return sprintf( + '%s%s%s', + trim($this->getSourceDirectory(), '\\/'), + DIRECTORY_SEPARATOR, + trim($file, '"') + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php new file mode 100644 index 00000000..7f1c89d3 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php @@ -0,0 +1,143 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock; +use Webmozart\Assert\Assert; + +/** + * Converts a DocBlock back from an object to a complete DocComment including Asterisks. + */ +class Serializer +{ + /** @var string The string to indent the comment with. */ + protected $indentString = ' '; + + /** @var int The number of times the indent string is repeated. */ + protected $indent = 0; + + /** @var bool Whether to indent the first line with the given indent amount and string. */ + protected $isFirstLineIndented = true; + + /** @var int|null The max length of a line. */ + protected $lineLength = null; + + /** + * Create a Serializer instance. + * + * @param int $indent The number of times the indent string is repeated. + * @param string $indentString The string to indent the comment with. + * @param bool $indentFirstLine Whether to indent the first line. + * @param int|null $lineLength The max length of a line or NULL to disable line wrapping. + */ + public function __construct($indent = 0, $indentString = ' ', $indentFirstLine = true, $lineLength = null) + { + Assert::integer($indent); + Assert::string($indentString); + Assert::boolean($indentFirstLine); + Assert::nullOrInteger($lineLength); + + $this->indent = $indent; + $this->indentString = $indentString; + $this->isFirstLineIndented = $indentFirstLine; + $this->lineLength = $lineLength; + } + + /** + * Generate a DocBlock comment. + * + * @param DocBlock $docblock The DocBlock to serialize. + * + * @return string The serialized doc block. + */ + public function getDocComment(DocBlock $docblock) + { + $indent = str_repeat($this->indentString, $this->indent); + $firstIndent = $this->isFirstLineIndented ? $indent : ''; + // 3 === strlen(' * ') + $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null; + + $text = $this->removeTrailingSpaces( + $indent, + $this->addAsterisksForEachLine( + $indent, + $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength) + ) + ); + + $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n"; + $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment); + $comment .= $indent . ' */'; + + return $comment; + } + + /** + * @param $indent + * @param $text + * @return mixed + */ + private function removeTrailingSpaces($indent, $text) + { + return str_replace("\n{$indent} * \n", "\n{$indent} *\n", $text); + } + + /** + * @param $indent + * @param $text + * @return mixed + */ + private function addAsterisksForEachLine($indent, $text) + { + return str_replace("\n", "\n{$indent} * ", $text); + } + + /** + * @param DocBlock $docblock + * @param $wrapLength + * @return string + */ + private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, $wrapLength) + { + $text = $docblock->getSummary() . ((string)$docblock->getDescription() ? "\n\n" . $docblock->getDescription() + : ''); + if ($wrapLength !== null) { + $text = wordwrap($text, $wrapLength); + return $text; + } + return $text; + } + + /** + * @param DocBlock $docblock + * @param $wrapLength + * @param $indent + * @param $comment + * @return string + */ + private function addTagBlock(DocBlock $docblock, $wrapLength, $indent, $comment) + { + foreach ($docblock->getTags() as $tag) { + $formatter = new DocBlock\Tags\Formatter\PassthroughFormatter(); + $tagText = $formatter->format($tag); + if ($wrapLength !== null) { + $tagText = wordwrap($tagText, $wrapLength); + } + $tagText = str_replace("\n", "\n{$indent} * ", $tagText); + + $comment .= "{$indent} * {$tagText}\n"; + } + + return $comment; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php new file mode 100644 index 00000000..0a656466 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php @@ -0,0 +1,314 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock\Tags\Factory\StaticMethod; +use phpDocumentor\Reflection\DocBlock\Tags\Generic; +use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Creates a Tag object given the contents of a tag. + * + * This Factory is capable of determining the appropriate class for a tag and instantiate it using its `create` + * factory method. The `create` factory method of a Tag can have a variable number of arguments; this way you can + * pass the dependencies that you need to construct a tag object. + * + * > Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise + * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to + * > verify that a dependency is actually passed. + * + * This Factory also features a Service Locator component that is used to pass the right dependencies to the + * `create` method of a tag; each dependency should be registered as a service or as a parameter. + * + * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass + * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface. + */ +final class StandardTagFactory implements TagFactory +{ + /** PCRE regular expression matching a tag name. */ + const REGEX_TAGNAME = '[\w\-\_\\\\]+'; + + /** + * @var string[] An array with a tag as a key, and an FQCN to a class that handles it as an array value. + */ + private $tagHandlerMappings = [ + 'author' => '\phpDocumentor\Reflection\DocBlock\Tags\Author', + 'covers' => '\phpDocumentor\Reflection\DocBlock\Tags\Covers', + 'deprecated' => '\phpDocumentor\Reflection\DocBlock\Tags\Deprecated', + // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example', + 'link' => '\phpDocumentor\Reflection\DocBlock\Tags\Link', + 'method' => '\phpDocumentor\Reflection\DocBlock\Tags\Method', + 'param' => '\phpDocumentor\Reflection\DocBlock\Tags\Param', + 'property-read' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyRead', + 'property' => '\phpDocumentor\Reflection\DocBlock\Tags\Property', + 'property-write' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite', + 'return' => '\phpDocumentor\Reflection\DocBlock\Tags\Return_', + 'see' => '\phpDocumentor\Reflection\DocBlock\Tags\See', + 'since' => '\phpDocumentor\Reflection\DocBlock\Tags\Since', + 'source' => '\phpDocumentor\Reflection\DocBlock\Tags\Source', + 'throw' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws', + 'throws' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws', + 'uses' => '\phpDocumentor\Reflection\DocBlock\Tags\Uses', + 'var' => '\phpDocumentor\Reflection\DocBlock\Tags\Var_', + 'version' => '\phpDocumentor\Reflection\DocBlock\Tags\Version' + ]; + + /** + * @var \ReflectionParameter[][] a lazy-loading cache containing parameters for each tagHandler that has been used. + */ + private $tagHandlerParameterCache = []; + + /** + * @var FqsenResolver + */ + private $fqsenResolver; + + /** + * @var mixed[] an array representing a simple Service Locator where we can store parameters and + * services that can be inserted into the Factory Methods of Tag Handlers. + */ + private $serviceLocator = []; + + /** + * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers. + * + * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property + * is used. + * + * @param FqsenResolver $fqsenResolver + * @param string[] $tagHandlers + * + * @see self::registerTagHandler() to add a new tag handler to the existing default list. + */ + public function __construct(FqsenResolver $fqsenResolver, array $tagHandlers = null) + { + $this->fqsenResolver = $fqsenResolver; + if ($tagHandlers !== null) { + $this->tagHandlerMappings = $tagHandlers; + } + + $this->addService($fqsenResolver, FqsenResolver::class); + } + + /** + * {@inheritDoc} + */ + public function create($tagLine, TypeContext $context = null) + { + if (! $context) { + $context = new TypeContext(''); + } + + list($tagName, $tagBody) = $this->extractTagParts($tagLine); + + return $this->createTag($tagBody, $tagName, $context); + } + + /** + * {@inheritDoc} + */ + public function addParameter($name, $value) + { + $this->serviceLocator[$name] = $value; + } + + /** + * {@inheritDoc} + */ + public function addService($service, $alias = null) + { + $this->serviceLocator[$alias ?: get_class($service)] = $service; + } + + /** + * {@inheritDoc} + */ + public function registerTagHandler($tagName, $handler) + { + Assert::stringNotEmpty($tagName); + Assert::stringNotEmpty($handler); + Assert::classExists($handler); + Assert::implementsInterface($handler, StaticMethod::class); + + if (strpos($tagName, '\\') && $tagName[0] !== '\\') { + throw new \InvalidArgumentException( + 'A namespaced tag must have a leading backslash as it must be fully qualified' + ); + } + + $this->tagHandlerMappings[$tagName] = $handler; + } + + /** + * Extracts all components for a tag. + * + * @param string $tagLine + * + * @return string[] + */ + private function extractTagParts($tagLine) + { + $matches = array(); + if (! preg_match('/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us', $tagLine, $matches)) { + throw new \InvalidArgumentException( + 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors' + ); + } + + if (count($matches) < 3) { + $matches[] = ''; + } + + return array_slice($matches, 1); + } + + /** + * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the + * body was invalid. + * + * @param string $body + * @param string $name + * @param TypeContext $context + * + * @return Tag|null + */ + private function createTag($body, $name, TypeContext $context) + { + $handlerClassName = $this->findHandlerClassName($name, $context); + $arguments = $this->getArgumentsForParametersFromWiring( + $this->fetchParametersForHandlerFactoryMethod($handlerClassName), + $this->getServiceLocatorWithDynamicParameters($context, $name, $body) + ) + ; + + return call_user_func_array([$handlerClassName, 'create'], $arguments); + } + + /** + * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`). + * + * @param string $tagName + * @param TypeContext $context + * + * @return string + */ + private function findHandlerClassName($tagName, TypeContext $context) + { + $handlerClassName = Generic::class; + if (isset($this->tagHandlerMappings[$tagName])) { + $handlerClassName = $this->tagHandlerMappings[$tagName]; + } elseif ($this->isAnnotation($tagName)) { + // TODO: Annotation support is planned for a later stage and as such is disabled for now + // $tagName = (string)$this->fqsenResolver->resolve($tagName, $context); + // if (isset($this->annotationMappings[$tagName])) { + // $handlerClassName = $this->annotationMappings[$tagName]; + // } + } + + return $handlerClassName; + } + + /** + * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters. + * + * @param \ReflectionParameter[] $parameters + * @param mixed[] $locator + * + * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters + * is provided with this method. + */ + private function getArgumentsForParametersFromWiring($parameters, $locator) + { + $arguments = []; + foreach ($parameters as $index => $parameter) { + $typeHint = $parameter->getClass() ? $parameter->getClass()->getName() : null; + if (isset($locator[$typeHint])) { + $arguments[] = $locator[$typeHint]; + continue; + } + + $parameterName = $parameter->getName(); + if (isset($locator[$parameterName])) { + $arguments[] = $locator[$parameterName]; + continue; + } + + $arguments[] = null; + } + + return $arguments; + } + + /** + * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given + * tag handler class name. + * + * @param string $handlerClassName + * + * @return \ReflectionParameter[] + */ + private function fetchParametersForHandlerFactoryMethod($handlerClassName) + { + if (! isset($this->tagHandlerParameterCache[$handlerClassName])) { + $methodReflection = new \ReflectionMethod($handlerClassName, 'create'); + $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters(); + } + + return $this->tagHandlerParameterCache[$handlerClassName]; + } + + /** + * Returns a copy of this class' Service Locator with added dynamic parameters, such as the tag's name, body and + * Context. + * + * @param TypeContext $context The Context (namespace and aliasses) that may be passed and is used to resolve FQSENs. + * @param string $tagName The name of the tag that may be passed onto the factory method of the Tag class. + * @param string $tagBody The body of the tag that may be passed onto the factory method of the Tag class. + * + * @return mixed[] + */ + private function getServiceLocatorWithDynamicParameters(TypeContext $context, $tagName, $tagBody) + { + $locator = array_merge( + $this->serviceLocator, + [ + 'name' => $tagName, + 'body' => $tagBody, + TypeContext::class => $context + ] + ); + + return $locator; + } + + /** + * Returns whether the given tag belongs to an annotation. + * + * @param string $tagContent + * + * @todo this method should be populated once we implement Annotation notation support. + * + * @return bool + */ + private function isAnnotation($tagContent) + { + // 1. Contains a namespace separator + // 2. Contains parenthesis + // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part + // of the annotation class name matches the found tag name + + return false; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php new file mode 100644 index 00000000..e7653678 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php @@ -0,0 +1,26 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\DocBlock\Tags\Formatter; + +interface Tag +{ + public function getName(); + + public static function create($body); + + public function render(Formatter $formatter = null); + + public function __toString(); +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php new file mode 100644 index 00000000..3c1d1132 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php @@ -0,0 +1,93 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use phpDocumentor\Reflection\Types\Context as TypeContext; + +interface TagFactory +{ + /** + * Adds a parameter to the service locator that can be injected in a tag's factory method. + * + * When calling a tag's "create" method we always check the signature for dependencies to inject. One way is to + * typehint a parameter in the signature so that we can use that interface or class name to inject a dependency + * (see {@see addService()} for more information on that). + * + * Another way is to check the name of the argument against the names in the Service Locator. With this method + * you can add a variable that will be inserted when a tag's create method is not typehinted and has a matching + * name. + * + * Be aware that there are two reserved names: + * + * - name, representing the name of the tag. + * - body, representing the complete body of the tag. + * + * These parameters are injected at the last moment and will override any existing parameter with those names. + * + * @param string $name + * @param mixed $value + * + * @return void + */ + public function addParameter($name, $value); + + /** + * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided. + * + * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter + * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint. + * + * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the + * interface is passed as alias then every time that interface is requested the provided service will be returned. + * + * @param object $service + * @param string $alias + * + * @return void + */ + public function addService($service); + + /** + * Factory method responsible for instantiating the correct sub type. + * + * @param string $tagLine The text for this tag, including description. + * @param TypeContext $context + * + * @throws \InvalidArgumentException if an invalid tag line was presented. + * + * @return Tag A new tag object. + */ + public function create($tagLine, TypeContext $context = null); + + /** + * Registers a handler for tags. + * + * If you want to use your own tags then you can use this method to instruct the TagFactory to register the name + * of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement the {@see Tag} interface (and thus + * the create method). + * + * @param string $tagName Name of tag to register a handler for. When registering a namespaced tag, the full + * name, along with a prefixing slash MUST be provided. + * @param string $handler FQCN of handler. + * + * @throws \InvalidArgumentException if the tag name is not a string + * @throws \InvalidArgumentException if the tag name is namespaced (contains backslashes) but does not start with + * a backslash + * @throws \InvalidArgumentException if the handler is not a string + * @throws \InvalidArgumentException if the handler is not an existing class + * @throws \InvalidArgumentException if the handler does not implement the {@see Tag} interface + * + * @return void + */ + public function registerTagHandler($tagName, $handler); +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php new file mode 100644 index 00000000..41a27886 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php @@ -0,0 +1,100 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Webmozart\Assert\Assert; + +/** + * Reflection class for an {@}author tag in a Docblock. + */ +final class Author extends BaseTag implements Factory\StaticMethod +{ + /** @var string register that this is the author tag. */ + protected $name = 'author'; + + /** @var string The name of the author */ + private $authorName = ''; + + /** @var string The email of the author */ + private $authorEmail = ''; + + /** + * Initializes this tag with the author name and e-mail. + * + * @param string $authorName + * @param string $authorEmail + */ + public function __construct($authorName, $authorEmail) + { + Assert::string($authorName); + Assert::string($authorEmail); + if ($authorEmail && !filter_var($authorEmail, FILTER_VALIDATE_EMAIL)) { + throw new \InvalidArgumentException('The author tag does not have a valid e-mail address'); + } + + $this->authorName = $authorName; + $this->authorEmail = $authorEmail; + } + + /** + * Gets the author's name. + * + * @return string The author's name. + */ + public function getAuthorName() + { + return $this->authorName; + } + + /** + * Returns the author's email. + * + * @return string The author's email. + */ + public function getEmail() + { + return $this->authorEmail; + } + + /** + * Returns this tag in string form. + * + * @return string + */ + public function __toString() + { + return $this->authorName . '<' . $this->authorEmail . '>'; + } + + /** + * Attempts to create a new Author object based on ā€ he tag body. + * + * @param string $body + * + * @return static + */ + public static function create($body) + { + Assert::string($body); + + $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches); + if (!$splitTagContent) { + return null; + } + + $authorName = trim($matches[1]); + $email = isset($matches[2]) ? trim($matches[2]) : ''; + + return new static($authorName, $email); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php new file mode 100644 index 00000000..14bb7177 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php @@ -0,0 +1,52 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\DocBlock\Description; + +/** + * Parses a tag definition for a DocBlock. + */ +abstract class BaseTag implements DocBlock\Tag +{ + /** @var string Name of the tag */ + protected $name = ''; + + /** @var Description|null Description of the tag. */ + protected $description; + + /** + * Gets the name of this tag. + * + * @return string The name of this tag. + */ + public function getName() + { + return $this->name; + } + + public function getDescription() + { + return $this->description; + } + + public function render(Formatter $formatter = null) + { + if ($formatter === null) { + $formatter = new Formatter\PassthroughFormatter(); + } + + return $formatter->format($this); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php new file mode 100644 index 00000000..31b4f82c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php @@ -0,0 +1,84 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\FqsenResolver; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a @covers tag in a Docblock. + */ +final class Covers extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'covers'; + + /** @var Fqsen */ + private $refers = null; + + /** + * Initializes this tag. + * + * @param Fqsen $refers + * @param Description $description + */ + public function __construct(Fqsen $refers, Description $description = null) + { + $this->refers = $refers; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + DescriptionFactory $descriptionFactory = null, + FqsenResolver $resolver = null, + TypeContext $context = null + ) + { + Assert::string($body); + Assert::notEmpty($body); + + $parts = preg_split('/\s+/Su', $body, 2); + + return new static( + $resolver->resolve($parts[0], $context), + $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context) + ); + } + + /** + * Returns the structural element this tag refers to. + * + * @return Fqsen + */ + public function getReference() + { + return $this->refers; + } + + /** + * Returns a string representation of this tag. + * + * @return string + */ + public function __toString() + { + return $this->refers . ($this->description ? ' ' . $this->description->render() : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php new file mode 100644 index 00000000..d3a0bd7b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php @@ -0,0 +1,94 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}deprecated tag in a Docblock. + */ +final class Deprecated extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'deprecated'; + + /** + * PCRE regular expression matching a version vector. + * Assumes the "x" modifier. + */ + const REGEX_VECTOR = '(?: + # Normal release vectors. + \d\S* + | + # VCS version vectors. Per PHPCS, they are expected to + # follow the form of the VCS name, followed by ":", followed + # by the version vector itself. + # By convention, popular VCSes like CVS, SVN and GIT use "$" + # around the actual version vector. + [^\s\:]+\:\s*\$[^\$]+\$ + )'; + + /** @var string The version vector. */ + private $version = ''; + + public function __construct($version = null, Description $description = null) + { + Assert::nullOrStringNotEmpty($version); + + $this->version = $version; + $this->description = $description; + } + + /** + * @return static + */ + public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) + { + Assert::nullOrString($body); + if (empty($body)) { + return new static(); + } + + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { + return null; + } + + return new static( + $matches[1], + $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context) + ); + } + + /** + * Gets the version section of the tag. + * + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return $this->version . ($this->description ? ' ' . $this->description->render() : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php new file mode 100644 index 00000000..571ef8df --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php @@ -0,0 +1,158 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Tag; + +/** + * Reflection class for a {@}example tag in a Docblock. + */ +final class Example extends BaseTag +{ + /** + * @var string Path to a file to use as an example. May also be an absolute URI. + */ + private $filePath = ''; + + /** + * @var bool Whether the file path component represents an URI. This determines how the file portion + * appears at {@link getContent()}. + */ + private $isURI = false; + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (null === $this->description) { + $filePath = '"' . $this->filePath . '"'; + if ($this->isURI) { + $filePath = $this->isUriRelative($this->filePath) + ? str_replace('%2F', '/', rawurlencode($this->filePath)) + :$this->filePath; + } + + $this->description = $filePath . ' ' . parent::getContent(); + } + + return $this->description; + } + + /** + * {@inheritdoc} + */ + public static function create($body) + { + // File component: File path in quotes or File URI / Source information + if (! preg_match('/^(?:\"([^\"]+)\"|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) { + return null; + } + + $filePath = null; + $fileUri = null; + if ('' !== $matches[1]) { + $filePath = $matches[1]; + } else { + $fileUri = $matches[2]; + } + + $startingLine = 1; + $lineCount = null; + $description = null; + + // Starting line / Number of lines / Description + if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $matches[3], $matches)) { + $startingLine = (int)$matches[1]; + if (isset($matches[2]) && $matches[2] !== '') { + $lineCount = (int)$matches[2]; + } + $description = $matches[3]; + } + + return new static($filePath, $fileUri, $startingLine, $lineCount, $description); + } + + /** + * Returns the file path. + * + * @return string Path to a file to use as an example. + * May also be an absolute URI. + */ + public function getFilePath() + { + return $this->filePath; + } + + /** + * Sets the file path. + * + * @param string $filePath The new file path to use for the example. + * + * @return $this + */ + public function setFilePath($filePath) + { + $this->isURI = false; + $this->filePath = trim($filePath); + + $this->description = null; + return $this; + } + + /** + * Sets the file path as an URI. + * + * This function is equivalent to {@link setFilePath()}, except that it + * converts an URI to a file path before that. + * + * There is no getFileURI(), as {@link getFilePath()} is compatible. + * + * @param string $uri The new file URI to use as an example. + * + * @return $this + */ + public function setFileURI($uri) + { + $this->isURI = true; + $this->description = null; + + $this->filePath = $this->isUriRelative($uri) + ? rawurldecode(str_replace(array('/', '\\'), '%2F', $uri)) + : $this->filePath = $uri; + + return $this; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return $this->filePath . ($this->description ? ' ' . $this->description->render() : ''); + } + + /** + * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute). + * + * @param string $uri + * + * @return bool + */ + private function isUriRelative($uri) + { + return false === strpos($uri, ':'); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php new file mode 100644 index 00000000..98aea455 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php @@ -0,0 +1,18 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags\Factory; + +interface StaticMethod +{ + public static function create($body); +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php new file mode 100644 index 00000000..b9ca0b8a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php @@ -0,0 +1,18 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags\Factory; + +interface Strategy +{ + public function create($body); +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php new file mode 100644 index 00000000..64b2c603 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php @@ -0,0 +1,27 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Tag; + +interface Formatter +{ + /** + * Formats a tag into a string representation according to a specific format, such as Markdown. + * + * @param Tag $tag + * + * @return string + */ + public function format(Tag $tag); +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php new file mode 100644 index 00000000..aa97572c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter; + +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\Tags\Formatter; + +class PassthroughFormatter implements Formatter +{ + /** + * Formats the given tag to return a simple plain text version. + * + * @param Tag $tag + * + * @return string + */ + public function format(Tag $tag) + { + return '@' . $tag->getName() . ' ' . (string)$tag; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php new file mode 100644 index 00000000..e4c53e00 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php @@ -0,0 +1,91 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\DocBlock\StandardTagFactory; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Parses a tag definition for a DocBlock. + */ +class Generic extends BaseTag implements Factory\StaticMethod +{ + /** + * Parses a tag and populates the member variables. + * + * @param string $name Name of the tag. + * @param Description $description The contents of the given tag. + */ + public function __construct($name, Description $description = null) + { + $this->validateTagName($name); + + $this->name = $name; + $this->description = $description; + } + + /** + * Creates a new tag that represents any unknown tag type. + * + * @param string $body + * @param string $name + * @param DescriptionFactory $descriptionFactory + * @param TypeContext $context + * + * @return static + */ + public static function create( + $body, + $name = '', + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::string($body); + Assert::stringNotEmpty($name); + Assert::notNull($descriptionFactory); + + $description = $descriptionFactory && $body ? $descriptionFactory->create($body, $context) : null; + + return new static($name, $description); + } + + /** + * Returns the tag as a serialized string + * + * @return string + */ + public function __toString() + { + return ($this->description ? $this->description->render() : ''); + } + + /** + * Validates if the tag name matches the expected format, otherwise throws an exception. + * + * @param string $name + * + * @return void + */ + private function validateTagName($name) + { + if (! preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) { + throw new \InvalidArgumentException( + 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, ' + . 'hyphens and backslashes.' + ); + } + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php new file mode 100644 index 00000000..9c0e367e --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php @@ -0,0 +1,77 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a @link tag in a Docblock. + */ +final class Link extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'link'; + + /** @var string */ + private $link = ''; + + /** + * Initializes a link to a URL. + * + * @param string $link + * @param Description $description + */ + public function __construct($link, Description $description = null) + { + Assert::string($link); + + $this->link = $link; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) + { + Assert::string($body); + Assert::notNull($descriptionFactory); + + $parts = preg_split('/\s+/Su', $body, 2); + $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; + + return new static($parts[0], $description); + } + + /** + * Gets the link + * + * @return string + */ + public function getLink() + { + return $this->link; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return $this->link . ($this->description ? ' ' . $this->description->render() : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php new file mode 100644 index 00000000..72dd1a0a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php @@ -0,0 +1,220 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\Types\Void_; +use Webmozart\Assert\Assert; + +/** + * Reflection class for an {@}method in a Docblock. + */ +final class Method extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'method'; + + /** @var string */ + private $methodName = ''; + + /** @var string[] */ + private $arguments = []; + + /** @var bool */ + private $isStatic = false; + + /** @var Type */ + private $returnType; + + public function __construct( + $methodName, + array $arguments = [], + Type $returnType = null, + $static = false, + Description $description = null + ) { + Assert::stringNotEmpty($methodName); + Assert::boolean($static); + + if ($returnType === null) { + $returnType = new Void_(); + } + + $this->methodName = $methodName; + $this->arguments = $this->filterArguments($arguments); + $this->returnType = $returnType; + $this->isStatic = $static; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::stringNotEmpty($body); + Assert::allNotNull([ $typeResolver, $descriptionFactory ]); + + // 1. none or more whitespace + // 2. optionally the keyword "static" followed by whitespace + // 3. optionally a word with underscores followed by whitespace : as + // type for the return value + // 4. then optionally a word with underscores followed by () and + // whitespace : as method name as used by phpDocumentor + // 5. then a word with underscores, followed by ( and any character + // until a ) and whitespace : as method name with signature + // 6. any remaining text : as description + if (!preg_match( + '/^ + # Static keyword + # Declares a static method ONLY if type is also present + (?: + (static) + \s+ + )? + # Return type + (?: + ( + (?:[\w\|_\\\\]+) + # array notation + (?:\[\])* + )? + \s+ + )? + # Legacy method name (not captured) + (?: + [\w_]+\(\)\s+ + )? + # Method name + ([\w\|_\\\\]+) + # Arguments + (?: + \(([^\)]*)\) + )? + \s* + # Description + (.*) + $/sux', + $body, + $matches + )) { + return null; + } + + list(, $static, $returnType, $methodName, $arguments, $description) = $matches; + + $static = $static === 'static'; + $returnType = $typeResolver->resolve($returnType, $context); + $description = $descriptionFactory->create($description, $context); + + if ('' !== $arguments) { + $arguments = explode(',', $arguments); + foreach($arguments as &$argument) { + $argument = explode(' ', trim($argument)); + if ($argument[0][0] === '$') { + $argumentName = substr($argument[0], 1); + $argumentType = new Void_(); + } else { + $argumentType = $typeResolver->resolve($argument[0], $context); + $argumentName = ''; + if (isset($argument[1])) { + $argumentName = substr($argument[1], 1); + } + } + + $argument = [ 'name' => $argumentName, 'type' => $argumentType]; + } + } else { + $arguments = []; + } + + return new static($methodName, $arguments, $returnType, $static, $description); + } + + /** + * Retrieves the method name. + * + * @return string + */ + public function getMethodName() + { + return $this->methodName; + } + + /** + * @return string[] + */ + public function getArguments() + { + return $this->arguments; + } + + /** + * Checks whether the method tag describes a static method or not. + * + * @return bool TRUE if the method declaration is for a static method, FALSE otherwise. + */ + public function isStatic() + { + return $this->isStatic; + } + + /** + * @return Type + */ + public function getReturnType() + { + return $this->returnType; + } + + public function __toString() + { + $arguments = []; + foreach ($this->arguments as $argument) { + $arguments[] = $argument['type'] . ' $' . $argument['name']; + } + + return ($this->isStatic() ? 'static ' : '') + . (string)$this->returnType . ' ' + . $this->methodName + . '(' . implode(', ', $arguments) . ')' + . ($this->description ? ' ' . $this->description->render() : ''); + } + + private function filterArguments($arguments) + { + foreach ($arguments as &$argument) { + if (is_string($argument)) { + $argument = [ 'name' => $argument ]; + } + if (! isset($argument['type'])) { + $argument['type'] = new Void_(); + } + $keys = array_keys($argument); + if ($keys !== [ 'name', 'type' ]) { + throw new \InvalidArgumentException( + 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true) + ); + } + } + + return $arguments; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php new file mode 100644 index 00000000..1a51dc0d --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php @@ -0,0 +1,141 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for the {@}param tag in a Docblock. + */ +final class Param extends BaseTag implements Factory\StaticMethod +{ + /** @var string */ + protected $name = 'param'; + + /** @var Type */ + private $type; + + /** @var string */ + private $variableName = ''; + + /** @var bool determines whether this is a variadic argument */ + private $isVariadic = false; + + /** + * @param string $variableName + * @param Type $type + * @param bool $isVariadic + * @param Description $description + */ + public function __construct($variableName, Type $type = null, $isVariadic = false, Description $description = null) + { + Assert::string($variableName); + Assert::boolean($isVariadic); + + $this->variableName = $variableName; + $this->type = $type; + $this->isVariadic = $isVariadic; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::stringNotEmpty($body); + Assert::allNotNull([$typeResolver, $descriptionFactory]); + + $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + $type = null; + $variableName = ''; + $isVariadic = false; + + // if the first item that is encountered is not a variable; it is a type + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { + $type = $typeResolver->resolve(array_shift($parts), $context); + array_shift($parts); + } + + // if the next item starts with a $ or ...$ it must be the variable name + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$')) { + $variableName = array_shift($parts); + array_shift($parts); + + if (substr($variableName, 0, 3) === '...') { + $isVariadic = true; + $variableName = substr($variableName, 3); + } + + if (substr($variableName, 0, 1) === '$') { + $variableName = substr($variableName, 1); + } + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $isVariadic, $description); + } + + /** + * Returns the variable's name. + * + * @return string + */ + public function getVariableName() + { + return $this->variableName; + } + + /** + * Returns the variable's type or null if unknown. + * + * @return Type|null + */ + public function getType() + { + return $this->type; + } + + /** + * Returns whether this tag is variadic. + * + * @return boolean + */ + public function isVariadic() + { + return $this->isVariadic; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return ($this->type ? $this->type . ' ' : '') + . ($this->isVariadic() ? '...' : '') + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php new file mode 100644 index 00000000..3c597133 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php @@ -0,0 +1,118 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}property tag in a Docblock. + */ +class Property extends BaseTag implements Factory\StaticMethod +{ + /** @var string */ + protected $name = 'property'; + + /** @var Type */ + private $type; + + /** @var string */ + protected $variableName = ''; + + /** + * @param string $variableName + * @param Type $type + * @param Description $description + */ + public function __construct($variableName, Type $type = null, Description $description = null) + { + Assert::string($variableName); + + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::stringNotEmpty($body); + Assert::allNotNull([$typeResolver, $descriptionFactory]); + + $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + $type = null; + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { + $type = $typeResolver->resolve(array_shift($parts), $context); + array_shift($parts); + } + + // if the next item starts with a $ or ...$ it must be the variable name + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + $variableName = array_shift($parts); + array_shift($parts); + + if (substr($variableName, 0, 1) === '$') { + $variableName = substr($variableName, 1); + } + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + * + * @return string + */ + public function getVariableName() + { + return $this->variableName; + } + + /** + * Returns the variable's type or null if unknown. + * + * @return Type|null + */ + public function getType() + { + return $this->type; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return ($this->type ? $this->type . ' ' : '') + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php new file mode 100644 index 00000000..bf2b8056 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php @@ -0,0 +1,118 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}property-read tag in a Docblock. + */ +class PropertyRead extends BaseTag implements Factory\StaticMethod +{ + /** @var string */ + protected $name = 'property-read'; + + /** @var Type */ + private $type; + + /** @var string */ + protected $variableName = ''; + + /** + * @param string $variableName + * @param Type $type + * @param Description $description + */ + public function __construct($variableName, Type $type = null, Description $description = null) + { + Assert::string($variableName); + + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::stringNotEmpty($body); + Assert::allNotNull([$typeResolver, $descriptionFactory]); + + $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + $type = null; + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { + $type = $typeResolver->resolve(array_shift($parts), $context); + array_shift($parts); + } + + // if the next item starts with a $ or ...$ it must be the variable name + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + $variableName = array_shift($parts); + array_shift($parts); + + if (substr($variableName, 0, 1) === '$') { + $variableName = substr($variableName, 1); + } + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + * + * @return string + */ + public function getVariableName() + { + return $this->variableName; + } + + /** + * Returns the variable's type or null if unknown. + * + * @return Type|null + */ + public function getType() + { + return $this->type; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return ($this->type ? $this->type . ' ' : '') + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php new file mode 100644 index 00000000..db37e0fb --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php @@ -0,0 +1,118 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}property-write tag in a Docblock. + */ +class PropertyWrite extends BaseTag implements Factory\StaticMethod +{ + /** @var string */ + protected $name = 'property-write'; + + /** @var Type */ + private $type; + + /** @var string */ + protected $variableName = ''; + + /** + * @param string $variableName + * @param Type $type + * @param Description $description + */ + public function __construct($variableName, Type $type = null, Description $description = null) + { + Assert::string($variableName); + + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::stringNotEmpty($body); + Assert::allNotNull([$typeResolver, $descriptionFactory]); + + $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + $type = null; + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { + $type = $typeResolver->resolve(array_shift($parts), $context); + array_shift($parts); + } + + // if the next item starts with a $ or ...$ it must be the variable name + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + $variableName = array_shift($parts); + array_shift($parts); + + if (substr($variableName, 0, 1) === '$') { + $variableName = substr($variableName, 1); + } + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + * + * @return string + */ + public function getVariableName() + { + return $this->variableName; + } + + /** + * Returns the variable's type or null if unknown. + * + * @return Type|null + */ + public function getType() + { + return $this->type; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return ($this->type ? $this->type . ' ' : '') + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php new file mode 100644 index 00000000..09a5870e --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php @@ -0,0 +1,73 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}return tag in a Docblock. + */ +final class Return_ extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'return'; + + /** @var Type */ + private $type; + + public function __construct(Type $type, Description $description = null) + { + $this->type = $type; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) + { + Assert::string($body); + Assert::allNotNull([$typeResolver, $descriptionFactory]); + + $parts = preg_split('/\s+/Su', $body, 2); + + $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context); + $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context); + + return new static($type, $description); + } + + /** + * Returns the type section of the variable. + * + * @return Type + */ + public function getType() + { + return $this->type; + } + + public function __toString() + { + return $this->type . ' ' . $this->description; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php new file mode 100644 index 00000000..64ee3d8e --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php @@ -0,0 +1,81 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\DocBlock\Description; +use Webmozart\Assert\Assert; + +/** + * Reflection class for an {@}see tag in a Docblock. + */ +class See extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'see'; + + /** @var Fqsen */ + protected $refers = null; + + /** + * Initializes this tag. + * + * @param Fqsen $refers + * @param Description $description + */ + public function __construct(Fqsen $refers, Description $description = null) + { + $this->refers = $refers; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + FqsenResolver $resolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::string($body); + Assert::allNotNull([$resolver, $descriptionFactory]); + + $parts = preg_split('/\s+/Su', $body, 2); + $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null; + + return new static($resolver->resolve($parts[0], $context), $description); + } + + /** + * Returns the structural element this tag refers to. + * + * @return Fqsen + */ + public function getReference() + { + return $this->refers; + } + + /** + * Returns a string representation of this tag. + * + * @return string + */ + public function __toString() + { + return $this->refers . ($this->description ? ' ' . $this->description->render() : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php new file mode 100644 index 00000000..3d002ed3 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php @@ -0,0 +1,94 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}since tag in a Docblock. + */ +final class Since extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'since'; + + /** + * PCRE regular expression matching a version vector. + * Assumes the "x" modifier. + */ + const REGEX_VECTOR = '(?: + # Normal release vectors. + \d\S* + | + # VCS version vectors. Per PHPCS, they are expected to + # follow the form of the VCS name, followed by ":", followed + # by the version vector itself. + # By convention, popular VCSes like CVS, SVN and GIT use "$" + # around the actual version vector. + [^\s\:]+\:\s*\$[^\$]+\$ + )'; + + /** @var string The version vector. */ + private $version = ''; + + public function __construct($version = null, Description $description = null) + { + Assert::nullOrStringNotEmpty($version); + + $this->version = $version; + $this->description = $description; + } + + /** + * @return static + */ + public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) + { + Assert::nullOrString($body); + if (empty($body)) { + return new static(); + } + + $matches = []; + if (! preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { + return null; + } + + return new static( + $matches[1], + $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context) + ); + } + + /** + * Gets the version section of the tag. + * + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return $this->version . ($this->description ? ' ' . $this->description->render() : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php new file mode 100644 index 00000000..b0646b96 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php @@ -0,0 +1,96 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}source tag in a Docblock. + */ +final class Source extends BaseTag implements Factory\StaticMethod +{ + /** @var string */ + protected $name = 'source'; + + /** @var int The starting line, relative to the structural element's location. */ + private $startingLine = 1; + + /** @var int|null The number of lines, relative to the starting line. NULL means "to the end". */ + private $lineCount = null; + + public function __construct($startingLine, $lineCount = null, Description $description = null) + { + Assert::integerish($startingLine); + Assert::nullOrIntegerish($lineCount); + + $this->startingLine = (int)$startingLine; + $this->lineCount = $lineCount !== null ? (int)$lineCount : null; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) + { + Assert::stringNotEmpty($body); + Assert::notNull($descriptionFactory); + + $startingLine = 1; + $lineCount = null; + $description = null; + + // Starting line / Number of lines / Description + if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) { + $startingLine = (int)$matches[1]; + if (isset($matches[2]) && $matches[2] !== '') { + $lineCount = (int)$matches[2]; + } + $description = $matches[3]; + } + + return new static($startingLine, $lineCount, $descriptionFactory->create($description, $context)); + } + + /** + * Gets the starting line. + * + * @return int The starting line, relative to the structural element's + * location. + */ + public function getStartingLine() + { + return $this->startingLine; + } + + /** + * Returns the number of lines. + * + * @return int|null The number of lines, relative to the starting line. NULL + * means "to the end". + */ + public function getLineCount() + { + return $this->lineCount; + } + + public function __toString() + { + return $this->startingLine + . ($this->lineCount !== null ? ' ' . $this->lineCount : '') + . ($this->description ? ' ' . $this->description->render() : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php new file mode 100644 index 00000000..349e773b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php @@ -0,0 +1,72 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}throws tag in a Docblock. + */ +final class Throws extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'throws'; + + /** @var Type */ + private $type; + + public function __construct(Type $type, Description $description = null) + { + $this->type = $type; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::string($body); + Assert::allNotNull([$typeResolver, $descriptionFactory]); + + $parts = preg_split('/\s+/Su', $body, 2); + + $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context); + $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context); + + return new static($type, $description); + } + + /** + * Returns the type section of the variable. + * + * @return Type + */ + public function getType() + { + return $this->type; + } + + public function __toString() + { + return $this->type . ' ' . $this->description; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php new file mode 100644 index 00000000..00dc3e3b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php @@ -0,0 +1,83 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}uses tag in a Docblock. + */ +final class Uses extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'uses'; + + /** @var Fqsen */ + protected $refers = null; + + /** + * Initializes this tag. + * + * @param Fqsen $refers + * @param Description $description + */ + public function __construct(Fqsen $refers, Description $description = null) + { + $this->refers = $refers; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + FqsenResolver $resolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::string($body); + Assert::allNotNull([$resolver, $descriptionFactory]); + + $parts = preg_split('/\s+/Su', $body, 2); + + return new static( + $resolver->resolve($parts[0], $context), + $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context) + ); + } + + /** + * Returns the structural element this tag refers to. + * + * @return Fqsen + */ + public function getReference() + { + return $this->refers; + } + + /** + * Returns a string representation of this tag. + * + * @return string + */ + public function __toString() + { + return $this->refers . ' ' . $this->description->render(); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php new file mode 100644 index 00000000..e23c694b --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php @@ -0,0 +1,118 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Type; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context as TypeContext; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}var tag in a Docblock. + */ +class Var_ extends BaseTag implements Factory\StaticMethod +{ + /** @var string */ + protected $name = 'var'; + + /** @var Type */ + private $type; + + /** @var string */ + protected $variableName = ''; + + /** + * @param string $variableName + * @param Type $type + * @param Description $description + */ + public function __construct($variableName, Type $type = null, Description $description = null) + { + Assert::string($variableName); + + $this->variableName = $variableName; + $this->type = $type; + $this->description = $description; + } + + /** + * {@inheritdoc} + */ + public static function create( + $body, + TypeResolver $typeResolver = null, + DescriptionFactory $descriptionFactory = null, + TypeContext $context = null + ) { + Assert::stringNotEmpty($body); + Assert::allNotNull([$typeResolver, $descriptionFactory]); + + $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE); + $type = null; + $variableName = ''; + + // if the first item that is encountered is not a variable; it is a type + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] !== '$')) { + $type = $typeResolver->resolve(array_shift($parts), $context); + array_shift($parts); + } + + // if the next item starts with a $ or ...$ it must be the variable name + if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) { + $variableName = array_shift($parts); + array_shift($parts); + + if (substr($variableName, 0, 1) === '$') { + $variableName = substr($variableName, 1); + } + } + + $description = $descriptionFactory->create(implode('', $parts), $context); + + return new static($variableName, $type, $description); + } + + /** + * Returns the variable's name. + * + * @return string + */ + public function getVariableName() + { + return $this->variableName; + } + + /** + * Returns the variable's type or null if unknown. + * + * @return Type|null + */ + public function getType() + { + return $this->type; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return ($this->type ? $this->type . ' ' : '') + . '$' . $this->variableName + . ($this->description ? ' ' . $this->description : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php new file mode 100644 index 00000000..3e0e5bef --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php @@ -0,0 +1,94 @@ + + * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use phpDocumentor\Reflection\Types\Context as TypeContext; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use Webmozart\Assert\Assert; + +/** + * Reflection class for a {@}version tag in a Docblock. + */ +final class Version extends BaseTag implements Factory\StaticMethod +{ + protected $name = 'version'; + + /** + * PCRE regular expression matching a version vector. + * Assumes the "x" modifier. + */ + const REGEX_VECTOR = '(?: + # Normal release vectors. + \d\S* + | + # VCS version vectors. Per PHPCS, they are expected to + # follow the form of the VCS name, followed by ":", followed + # by the version vector itself. + # By convention, popular VCSes like CVS, SVN and GIT use "$" + # around the actual version vector. + [^\s\:]+\:\s*\$[^\$]+\$ + )'; + + /** @var string The version vector. */ + private $version = ''; + + public function __construct($version = null, Description $description = null) + { + Assert::nullOrStringNotEmpty($version); + + $this->version = $version; + $this->description = $description; + } + + /** + * @return static + */ + public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null) + { + Assert::nullOrString($body); + if (empty($body)) { + return new static(); + } + + $matches = []; + if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) { + return null; + } + + return new static( + $matches[1], + $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context) + ); + } + + /** + * Gets the version section of the tag. + * + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Returns a string representation for this tag. + * + * @return string + */ + public function __toString() + { + return $this->version . ($this->description ? ' ' . $this->description->render() : ''); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php new file mode 100644 index 00000000..9ec2455d --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php @@ -0,0 +1,277 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\DocBlock\StandardTagFactory; +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\TagFactory; +use Webmozart\Assert\Assert; + +final class DocBlockFactory implements DocBlockFactoryInterface +{ + /** @var DocBlock\DescriptionFactory */ + private $descriptionFactory; + + /** @var DocBlock\TagFactory */ + private $tagFactory; + + /** + * Initializes this factory with the required subcontractors. + * + * @param DescriptionFactory $descriptionFactory + * @param TagFactory $tagFactory + */ + public function __construct(DescriptionFactory $descriptionFactory, TagFactory $tagFactory) + { + $this->descriptionFactory = $descriptionFactory; + $this->tagFactory = $tagFactory; + } + + /** + * Factory method for easy instantiation. + * + * @param string[] $additionalTags + * + * @return DocBlockFactory + */ + public static function createInstance(array $additionalTags = []) + { + $fqsenResolver = new FqsenResolver(); + $tagFactory = new StandardTagFactory($fqsenResolver); + $descriptionFactory = new DescriptionFactory($tagFactory); + + $tagFactory->addService($descriptionFactory); + $tagFactory->addService(new TypeResolver($fqsenResolver)); + + $docBlockFactory = new self($descriptionFactory, $tagFactory); + foreach ($additionalTags as $tagName => $tagHandler) { + $docBlockFactory->registerTagHandler($tagName, $tagHandler); + } + + return $docBlockFactory; + } + + /** + * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the + * getDocComment method (such as a ReflectionClass object). + * @param Types\Context $context + * @param Location $location + * + * @return DocBlock + */ + public function create($docblock, Types\Context $context = null, Location $location = null) + { + if (is_object($docblock)) { + if (!method_exists($docblock, 'getDocComment')) { + $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method'; + throw new \InvalidArgumentException($exceptionMessage); + } + + $docblock = $docblock->getDocComment(); + } + + Assert::stringNotEmpty($docblock); + + if ($context === null) { + $context = new Types\Context(''); + } + + $parts = $this->splitDocBlock($this->stripDocComment($docblock)); + list($templateMarker, $summary, $description, $tags) = $parts; + + return new DocBlock( + $summary, + $description ? $this->descriptionFactory->create($description, $context) : null, + array_filter($this->parseTagBlock($tags, $context), function($tag) { + return $tag instanceof Tag; + }), + $context, + $location, + $templateMarker === '#@+', + $templateMarker === '#@-' + ); + } + + public function registerTagHandler($tagName, $handler) + { + $this->tagFactory->registerTagHandler($tagName, $handler); + } + + /** + * Strips the asterisks from the DocBlock comment. + * + * @param string $comment String containing the comment text. + * + * @return string + */ + private function stripDocComment($comment) + { + $comment = trim(preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', '$1', $comment)); + + // reg ex above is not able to remove */ from a single line docblock + if (substr($comment, -2) == '*/') { + $comment = trim(substr($comment, 0, -2)); + } + + return str_replace(array("\r\n", "\r"), "\n", $comment); + } + + /** + * Splits the DocBlock into a template marker, summary, description and block of tags. + * + * @param string $comment Comment to split into the sub-parts. + * + * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. + * @author Mike van Riel for extending the regex with template marker support. + * + * @return string[] containing the template marker (if any), summary, description and a string containing the tags. + */ + private function splitDocBlock($comment) + { + // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This + // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the + // performance impact of running a regular expression + if (strpos($comment, '@') === 0) { + return array('', '', '', $comment); + } + + // clears all extra horizontal whitespace from the line endings to prevent parsing issues + $comment = preg_replace('/\h*$/Sum', '', $comment); + + /* + * Splits the docblock into a template marker, summary, description and tags section. + * + * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may + * occur after it and will be stripped). + * - The short description is started from the first character until a dot is encountered followed by a + * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing + * errors). This is optional. + * - The long description, any character until a new line is encountered followed by an @ and word + * characters (a tag). This is optional. + * - Tags; the remaining characters + * + * Big thanks to RichardJ for contributing this Regular Expression + */ + preg_match( + '/ + \A + # 1. Extract the template marker + (?:(\#\@\+|\#\@\-)\n?)? + + # 2. Extract the summary + (?: + (?! @\pL ) # The summary may not start with an @ + ( + [^\n.]+ + (?: + (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines + [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line + [^\n.]+ # Include anything else + )* + \.? + )? + ) + + # 3. Extract the description + (?: + \s* # Some form of whitespace _must_ precede a description because a summary must be there + (?! @\pL ) # The description may not start with an @ + ( + [^\n]+ + (?: \n+ + (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line + [^\n]+ # Include anything else + )* + ) + )? + + # 4. Extract the tags (anything that follows) + (\s+ [\s\S]*)? # everything that follows + /ux', + $comment, + $matches + ); + array_shift($matches); + + while (count($matches) < 4) { + $matches[] = ''; + } + + return $matches; + } + + /** + * Creates the tag objects. + * + * @param string $tags Tag block to parse. + * @param Types\Context $context Context of the parsed Tag + * + * @return DocBlock\Tag[] + */ + private function parseTagBlock($tags, Types\Context $context) + { + $tags = $this->filterTagBlock($tags); + if (!$tags) { + return []; + } + + $result = $this->splitTagBlockIntoTagLines($tags); + foreach ($result as $key => $tagLine) { + $result[$key] = $this->tagFactory->create(trim($tagLine), $context); + } + + return $result; + } + + /** + * @param string $tags + * + * @return string[] + */ + private function splitTagBlockIntoTagLines($tags) + { + $result = array(); + foreach (explode("\n", $tags) as $tag_line) { + if (isset($tag_line[0]) && ($tag_line[0] === '@')) { + $result[] = $tag_line; + } else { + $result[count($result) - 1] .= "\n" . $tag_line; + } + } + + return $result; + } + + /** + * @param $tags + * @return string + */ + private function filterTagBlock($tags) + { + $tags = trim($tags); + if (!$tags) { + return null; + } + + if ('@' !== $tags[0]) { + // @codeCoverageIgnoreStart + // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that + // we didn't foresee. + throw new \LogicException('A tag block started with text instead of an at-sign(@): ' . $tags); + // @codeCoverageIgnoreEnd + } + + return $tags; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php new file mode 100644 index 00000000..b3533429 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php @@ -0,0 +1,23 @@ + - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -use phpDocumentor\Reflection\DocBlock\Tag; -use phpDocumentor\Reflection\DocBlock\Context; -use phpDocumentor\Reflection\DocBlock\Location; - -/** - * Parses the DocBlock for any structure. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class DocBlock implements \Reflector -{ - /** @var string The opening line for this docblock. */ - protected $short_description = ''; - - /** - * @var DocBlock\Description The actual - * description for this docblock. - */ - protected $long_description = null; - - /** - * @var Tag[] An array containing all - * the tags in this docblock; except inline. - */ - protected $tags = array(); - - /** @var Context Information about the context of this DocBlock. */ - protected $context = null; - - /** @var Location Information about the location of this DocBlock. */ - protected $location = null; - - /** @var bool Is this DocBlock (the start of) a template? */ - protected $isTemplateStart = false; - - /** @var bool Does this DocBlock signify the end of a DocBlock template? */ - protected $isTemplateEnd = false; - - /** - * Parses the given docblock and populates the member fields. - * - * The constructor may also receive namespace information such as the - * current namespace and aliases. This information is used by some tags - * (e.g. @return, @param, etc.) to turn a relative Type into a FQCN. - * - * @param \Reflector|string $docblock A docblock comment (including - * asterisks) or reflector supporting the getDocComment method. - * @param Context $context The context in which the DocBlock - * occurs. - * @param Location $location The location within the file that this - * DocBlock occurs in. - * - * @throws \InvalidArgumentException if the given argument does not have the - * getDocComment method. - */ - public function __construct( - $docblock, - Context $context = null, - Location $location = null - ) { - if (is_object($docblock)) { - if (!method_exists($docblock, 'getDocComment')) { - throw new \InvalidArgumentException( - 'Invalid object passed; the given reflector must support ' - . 'the getDocComment method' - ); - } - - $docblock = $docblock->getDocComment(); - } - - $docblock = $this->cleanInput($docblock); - - list($templateMarker, $short, $long, $tags) = $this->splitDocBlock($docblock); - $this->isTemplateStart = $templateMarker === '#@+'; - $this->isTemplateEnd = $templateMarker === '#@-'; - $this->short_description = $short; - $this->long_description = new DocBlock\Description($long, $this); - $this->parseTags($tags); - - $this->context = $context; - $this->location = $location; - } - - /** - * Strips the asterisks from the DocBlock comment. - * - * @param string $comment String containing the comment text. - * - * @return string - */ - protected function cleanInput($comment) - { - $comment = trim( - preg_replace( - '#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', - '$1', - $comment - ) - ); - - // reg ex above is not able to remove */ from a single line docblock - if (substr($comment, -2) == '*/') { - $comment = trim(substr($comment, 0, -2)); - } - - // normalize strings - $comment = str_replace(array("\r\n", "\r"), "\n", $comment); - - return $comment; - } - - /** - * Splits the DocBlock into a template marker, summary, description and block of tags. - * - * @param string $comment Comment to split into the sub-parts. - * - * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split. - * @author Mike van Riel for extending the regex with template marker support. - * - * @return string[] containing the template marker (if any), summary, description and a string containing the tags. - */ - protected function splitDocBlock($comment) - { - // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This - // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the - // performance impact of running a regular expression - if (strpos($comment, '@') === 0) { - return array('', '', '', $comment); - } - - // clears all extra horizontal whitespace from the line endings to prevent parsing issues - $comment = preg_replace('/\h*$/Sum', '', $comment); - - /* - * Splits the docblock into a template marker, short description, long description and tags section - * - * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may - * occur after it and will be stripped). - * - The short description is started from the first character until a dot is encountered followed by a - * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing - * errors). This is optional. - * - The long description, any character until a new line is encountered followed by an @ and word - * characters (a tag). This is optional. - * - Tags; the remaining characters - * - * Big thanks to RichardJ for contributing this Regular Expression - */ - preg_match( - '/ - \A - # 1. Extract the template marker - (?:(\#\@\+|\#\@\-)\n?)? - - # 2. Extract the summary - (?: - (?! @\pL ) # The summary may not start with an @ - ( - [^\n.]+ - (?: - (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines - [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line - [^\n.]+ # Include anything else - )* - \.? - )? - ) - - # 3. Extract the description - (?: - \s* # Some form of whitespace _must_ precede a description because a summary must be there - (?! @\pL ) # The description may not start with an @ - ( - [^\n]+ - (?: \n+ - (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line - [^\n]+ # Include anything else - )* - ) - )? - - # 4. Extract the tags (anything that follows) - (\s+ [\s\S]*)? # everything that follows - /ux', - $comment, - $matches - ); - array_shift($matches); - - while (count($matches) < 4) { - $matches[] = ''; - } - - return $matches; - } - - /** - * Creates the tag objects. - * - * @param string $tags Tag block to parse. - * - * @return void - */ - protected function parseTags($tags) - { - $result = array(); - $tags = trim($tags); - if ('' !== $tags) { - if ('@' !== $tags[0]) { - throw new \LogicException( - 'A tag block started with text instead of an actual tag,' - . ' this makes the tag block invalid: ' . $tags - ); - } - foreach (explode("\n", $tags) as $tag_line) { - if (isset($tag_line[0]) && ($tag_line[0] === '@')) { - $result[] = $tag_line; - } else { - $result[count($result) - 1] .= "\n" . $tag_line; - } - } - - // create proper Tag objects - foreach ($result as $key => $tag_line) { - $result[$key] = Tag::createInstance(trim($tag_line), $this); - } - } - - $this->tags = $result; - } - - /** - * Gets the text portion of the doc block. - * - * Gets the text portion (short and long description combined) of the doc - * block. - * - * @return string The text portion of the doc block. - */ - public function getText() - { - $short = $this->getShortDescription(); - $long = $this->getLongDescription()->getContents(); - - if ($long) { - return "{$short}\n\n{$long}"; - } else { - return $short; - } - } - - /** - * Set the text portion of the doc block. - * - * Sets the text portion (short and long description combined) of the doc - * block. - * - * @param string $docblock The new text portion of the doc block. - * - * @return $this This doc block. - */ - public function setText($comment) - { - list(,$short, $long) = $this->splitDocBlock($comment); - $this->short_description = $short; - $this->long_description = new DocBlock\Description($long, $this); - return $this; - } - /** - * Returns the opening line or also known as short description. - * - * @return string - */ - public function getShortDescription() - { - return $this->short_description; - } - - /** - * Returns the full description or also known as long description. - * - * @return DocBlock\Description - */ - public function getLongDescription() - { - return $this->long_description; - } - - /** - * Returns whether this DocBlock is the start of a Template section. - * - * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker - * (`#@+`) that is appended directly after the opening `/**` of a DocBlock. - * - * An example of such an opening is: - * - * ``` - * /**#@+ - * * My DocBlock - * * / - * ``` - * - * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all - * elements that follow until another DocBlock is found that contains the closing marker (`#@-`). - * - * @see self::isTemplateEnd() for the check whether a closing marker was provided. - * - * @return boolean - */ - public function isTemplateStart() - { - return $this->isTemplateStart; - } - - /** - * Returns whether this DocBlock is the end of a Template section. - * - * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality. - * - * @return boolean - */ - public function isTemplateEnd() - { - return $this->isTemplateEnd; - } - - /** - * Returns the current context. - * - * @return Context - */ - public function getContext() - { - return $this->context; - } - - /** - * Returns the current location. - * - * @return Location - */ - public function getLocation() - { - return $this->location; - } - - /** - * Returns the tags for this DocBlock. - * - * @return Tag[] - */ - public function getTags() - { - return $this->tags; - } - - /** - * Returns an array of tags matching the given name. If no tags are found - * an empty array is returned. - * - * @param string $name String to search by. - * - * @return Tag[] - */ - public function getTagsByName($name) - { - $result = array(); - - /** @var Tag $tag */ - foreach ($this->getTags() as $tag) { - if ($tag->getName() != $name) { - continue; - } - - $result[] = $tag; - } - - return $result; - } - - /** - * Checks if a tag of a certain type is present in this DocBlock. - * - * @param string $name Tag name to check for. - * - * @return bool - */ - public function hasTag($name) - { - /** @var Tag $tag */ - foreach ($this->getTags() as $tag) { - if ($tag->getName() == $name) { - return true; - } - } - - return false; - } - - /** - * Appends a tag at the end of the list of tags. - * - * @param Tag $tag The tag to add. - * - * @return Tag The newly added tag. - * - * @throws \LogicException When the tag belongs to a different DocBlock. - */ - public function appendTag(Tag $tag) - { - if (null === $tag->getDocBlock()) { - $tag->setDocBlock($this); - } - - if ($tag->getDocBlock() === $this) { - $this->tags[] = $tag; - } else { - throw new \LogicException( - 'This tag belongs to a different DocBlock object.' - ); - } - - return $tag; - } - - - /** - * Builds a string representation of this object. - * - * @todo determine the exact format as used by PHP Reflection and - * implement it. - * - * @return string - * @codeCoverageIgnore Not yet implemented - */ - public static function export() - { - throw new \Exception('Not yet implemented'); - } - - /** - * Returns the exported information (we should use the export static method - * BUT this throws an exception at this point). - * - * @return string - * @codeCoverageIgnore Not yet implemented - */ - public function __toString() - { - return 'Not yet implemented'; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php deleted file mode 100644 index 81aa83ce..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Context.php +++ /dev/null @@ -1,154 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -/** - * The context in which a DocBlock occurs. - * - * @author Vasil Rangelov - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class Context -{ - /** @var string The current namespace. */ - protected $namespace = ''; - - /** @var array List of namespace aliases => Fully Qualified Namespace. */ - protected $namespace_aliases = array(); - - /** @var string Name of the structural element, within the namespace. */ - protected $lsen = ''; - - /** - * Cteates a new context. - * @param string $namespace The namespace where this DocBlock - * resides in. - * @param array $namespace_aliases List of namespace aliases => Fully - * Qualified Namespace. - * @param string $lsen Name of the structural element, within - * the namespace. - */ - public function __construct( - $namespace = '', - array $namespace_aliases = array(), - $lsen = '' - ) { - if (!empty($namespace)) { - $this->setNamespace($namespace); - } - $this->setNamespaceAliases($namespace_aliases); - $this->setLSEN($lsen); - } - - /** - * @return string The namespace where this DocBlock resides in. - */ - public function getNamespace() - { - return $this->namespace; - } - - /** - * @return array List of namespace aliases => Fully Qualified Namespace. - */ - public function getNamespaceAliases() - { - return $this->namespace_aliases; - } - - /** - * Returns the Local Structural Element Name. - * - * @return string Name of the structural element, within the namespace. - */ - public function getLSEN() - { - return $this->lsen; - } - - /** - * Sets a new namespace. - * - * Sets a new namespace for the context. Leading and trailing slashes are - * trimmed, and the keywords "global" and "default" are treated as aliases - * to no namespace. - * - * @param string $namespace The new namespace to set. - * - * @return $this - */ - public function setNamespace($namespace) - { - if ('global' !== $namespace - && 'default' !== $namespace - ) { - // Srip leading and trailing slash - $this->namespace = trim((string)$namespace, '\\'); - } else { - $this->namespace = ''; - } - return $this; - } - - /** - * Sets the namespace aliases, replacing all previous ones. - * - * @param array $namespace_aliases List of namespace aliases => Fully - * Qualified Namespace. - * - * @return $this - */ - public function setNamespaceAliases(array $namespace_aliases) - { - $this->namespace_aliases = array(); - foreach ($namespace_aliases as $alias => $fqnn) { - $this->setNamespaceAlias($alias, $fqnn); - } - return $this; - } - - /** - * Adds a namespace alias to the context. - * - * @param string $alias The alias name (the part after "as", or the last - * part of the Fully Qualified Namespace Name) to add. - * @param string $fqnn The Fully Qualified Namespace Name for this alias. - * Any form of leading/trailing slashes are accepted, but what will be - * stored is a name, prefixed with a slash, and no trailing slash. - * - * @return $this - */ - public function setNamespaceAlias($alias, $fqnn) - { - $this->namespace_aliases[$alias] = '\\' . trim((string)$fqnn, '\\'); - return $this; - } - - /** - * Sets a new Local Structural Element Name. - * - * Sets a new Local Structural Element Name. A local name also contains - * punctuation determining the kind of structural element (e.g. trailing "(" - * and ")" for functions and methods). - * - * @param string $lsen The new local name of a structural element. - * - * @return $this - */ - public function setLSEN($lsen) - { - $this->lsen = (string)$lsen; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php deleted file mode 100644 index d41142e2..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Description.php +++ /dev/null @@ -1,223 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock; - -/** - * Parses a Description of a DocBlock or tag. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class Description implements \Reflector -{ - /** @var string */ - protected $contents = ''; - - /** @var array The contents, as an array of strings and Tag objects. */ - protected $parsedContents = null; - - /** @var DocBlock The DocBlock which this description belongs to. */ - protected $docblock = null; - - /** - * Populates the fields of a description. - * - * @param string $content The description's conetnts. - * @param DocBlock $docblock The DocBlock which this description belongs to. - */ - public function __construct($content, DocBlock $docblock = null) - { - $this->setContent($content)->setDocBlock($docblock); - } - - /** - * Gets the text of this description. - * - * @return string - */ - public function getContents() - { - return $this->contents; - } - - /** - * Sets the text of this description. - * - * @param string $content The new text of this description. - * - * @return $this - */ - public function setContent($content) - { - $this->contents = trim($content); - - $this->parsedContents = null; - return $this; - } - - /** - * Returns the parsed text of this description. - * - * @return array An array of strings and tag objects, in the order they - * occur within the description. - */ - public function getParsedContents() - { - if (null === $this->parsedContents) { - $this->parsedContents = preg_split( - '/\{ - # "{@}" is not a valid inline tag. This ensures that - # we do not treat it as one, but treat it literally. - (?!@\}) - # We want to capture the whole tag line, but without the - # inline tag delimiters. - (\@ - # Match everything up to the next delimiter. - [^{}]* - # Nested inline tag content should not be captured, or - # it will appear in the result separately. - (?: - # Match nested inline tags. - (?: - # Because we did not catch the tag delimiters - # earlier, we must be explicit with them here. - # Notice that this also matches "{}", as a way - # to later introduce it as an escape sequence. - \{(?1)?\} - | - # Make sure we match hanging "{". - \{ - ) - # Match content after the nested inline tag. - [^{}]* - )* # If there are more inline tags, match them as well. - # We use "*" since there may not be any nested inline - # tags. - ) - \}/Sux', - $this->contents, - null, - PREG_SPLIT_DELIM_CAPTURE - ); - - $count = count($this->parsedContents); - for ($i=1; $i<$count; $i += 2) { - $this->parsedContents[$i] = Tag::createInstance( - $this->parsedContents[$i], - $this->docblock - ); - } - - //In order to allow "literal" inline tags, the otherwise invalid - //sequence "{@}" is changed to "@", and "{}" is changed to "}". - //See unit tests for examples. - for ($i=0; $i<$count; $i += 2) { - $this->parsedContents[$i] = str_replace( - array('{@}', '{}'), - array('@', '}'), - $this->parsedContents[$i] - ); - } - } - return $this->parsedContents; - } - - /** - * Return a formatted variant of the Long Description using MarkDown. - * - * @todo this should become a more intelligent piece of code where the - * configuration contains a setting what format long descriptions are. - * - * @codeCoverageIgnore Will be removed soon, in favor of adapters at - * PhpDocumentor itself that will process text in various formats. - * - * @return string - */ - public function getFormattedContents() - { - $result = $this->contents; - - // if the long description contains a plain HTML element, surround - // it with a pre element. Please note that we explicitly used str_replace - // and not preg_replace to gain performance - if (strpos($result, '') !== false) { - $result = str_replace( - array('', "\r\n", "\n", "\r", ''), - array('
    ', '', '', '', '
    '), - $result - ); - } - - if (class_exists('Parsedown')) { - $markdown = \Parsedown::instance(); - $result = $markdown->parse($result); - } elseif (class_exists('dflydev\markdown\MarkdownExtraParser')) { - $markdown = new \dflydev\markdown\MarkdownExtraParser(); - $result = $markdown->transformMarkdown($result); - } - - return trim($result); - } - - /** - * Gets the docblock this tag belongs to. - * - * @return DocBlock The docblock this description belongs to. - */ - public function getDocBlock() - { - return $this->docblock; - } - - /** - * Sets the docblock this tag belongs to. - * - * @param DocBlock $docblock The new docblock this description belongs to. - * Setting NULL removes any association. - * - * @return $this - */ - public function setDocBlock(DocBlock $docblock = null) - { - $this->docblock = $docblock; - - return $this; - } - - /** - * Builds a string representation of this object. - * - * @todo determine the exact format as used by PHP Reflection - * and implement it. - * - * @return void - * @codeCoverageIgnore Not yet implemented - */ - public static function export() - { - throw new \Exception('Not yet implemented'); - } - - /** - * Returns the long description as a string. - * - * @return string - */ - public function __toString() - { - return $this->getContents(); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php deleted file mode 100644 index 966ed44d..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -/** - * The location a DocBlock occurs within a file. - * - * @author Vasil Rangelov - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class Location -{ - /** @var int Line where the DocBlock text starts. */ - protected $lineNumber = 0; - - /** @var int Column where the DocBlock text starts. */ - protected $columnNumber = 0; - - public function __construct( - $lineNumber = 0, - $columnNumber = 0 - ) { - $this->setLineNumber($lineNumber)->setColumnNumber($columnNumber); - } - - /** - * @return int Line where the DocBlock text starts. - */ - public function getLineNumber() - { - return $this->lineNumber; - } - - /** - * - * @param type $lineNumber - * @return $this - */ - public function setLineNumber($lineNumber) - { - $this->lineNumber = (int)$lineNumber; - - return $this; - } - - /** - * @return int Column where the DocBlock text starts. - */ - public function getColumnNumber() - { - return $this->columnNumber; - } - - /** - * - * @param int $columnNumber - * @return $this - */ - public function setColumnNumber($columnNumber) - { - $this->columnNumber = (int)$columnNumber; - - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php deleted file mode 100644 index c1617850..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php +++ /dev/null @@ -1,198 +0,0 @@ - - * @copyright 2013 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock; - -/** - * Serializes a DocBlock instance. - * - * @author Barry vd. Heuvel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class Serializer -{ - - /** @var string The string to indent the comment with. */ - protected $indentString = ' '; - - /** @var int The number of times the indent string is repeated. */ - protected $indent = 0; - - /** @var bool Whether to indent the first line. */ - protected $isFirstLineIndented = true; - - /** @var int|null The max length of a line. */ - protected $lineLength = null; - - /** - * Create a Serializer instance. - * - * @param int $indent The number of times the indent string is - * repeated. - * @param string $indentString The string to indent the comment with. - * @param bool $indentFirstLine Whether to indent the first line. - * @param int|null $lineLength The max length of a line or NULL to - * disable line wrapping. - */ - public function __construct( - $indent = 0, - $indentString = ' ', - $indentFirstLine = true, - $lineLength = null - ) { - $this->setIndentationString($indentString); - $this->setIndent($indent); - $this->setIsFirstLineIndented($indentFirstLine); - $this->setLineLength($lineLength); - } - - /** - * Sets the string to indent comments with. - * - * @param string $indentationString The string to indent comments with. - * - * @return $this This serializer object. - */ - public function setIndentationString($indentString) - { - $this->indentString = (string)$indentString; - return $this; - } - - /** - * Gets the string to indent comments with. - * - * @return string The indent string. - */ - public function getIndentationString() - { - return $this->indentString; - } - - /** - * Sets the number of indents. - * - * @param int $indent The number of times the indent string is repeated. - * - * @return $this This serializer object. - */ - public function setIndent($indent) - { - $this->indent = (int)$indent; - return $this; - } - - /** - * Gets the number of indents. - * - * @return int The number of times the indent string is repeated. - */ - public function getIndent() - { - return $this->indent; - } - - /** - * Sets whether or not the first line should be indented. - * - * Sets whether or not the first line (the one with the "/**") should be - * indented. - * - * @param bool $indentFirstLine The new value for this setting. - * - * @return $this This serializer object. - */ - public function setIsFirstLineIndented($indentFirstLine) - { - $this->isFirstLineIndented = (bool)$indentFirstLine; - return $this; - } - - /** - * Gets whether or not the first line should be indented. - * - * @return bool Whether or not the first line should be indented. - */ - public function isFirstLineIndented() - { - return $this->isFirstLineIndented; - } - - /** - * Sets the line length. - * - * Sets the length of each line in the serialization. Content will be - * wrapped within this limit. - * - * @param int|null $lineLength The length of each line. NULL to disable line - * wrapping altogether. - * - * @return $this This serializer object. - */ - public function setLineLength($lineLength) - { - $this->lineLength = null === $lineLength ? null : (int)$lineLength; - return $this; - } - - /** - * Gets the line length. - * - * @return int|null The length of each line or NULL if line wrapping is - * disabled. - */ - public function getLineLength() - { - return $this->lineLength; - } - - /** - * Generate a DocBlock comment. - * - * @param DocBlock The DocBlock to serialize. - * - * @return string The serialized doc block. - */ - public function getDocComment(DocBlock $docblock) - { - $indent = str_repeat($this->indentString, $this->indent); - $firstIndent = $this->isFirstLineIndented ? $indent : ''; - - $text = $docblock->getText(); - if ($this->lineLength) { - //3 === strlen(' * ') - $wrapLength = $this->lineLength - strlen($indent) - 3; - $text = wordwrap($text, $wrapLength); - } - $text = str_replace("\n", "\n{$indent} * ", $text); - - $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n"; - - /** @var Tag $tag */ - foreach ($docblock->getTags() as $tag) { - $tagText = (string) $tag; - if ($this->lineLength) { - $tagText = wordwrap($tagText, $wrapLength); - } - $tagText = str_replace("\n", "\n{$indent} * ", $tagText); - - $comment .= "{$indent} * {$tagText}\n"; - } - - $comment .= $indent . ' */'; - - return $comment; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php deleted file mode 100644 index a96db095..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php +++ /dev/null @@ -1,377 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock; - -/** - * Parses a tag definition for a DocBlock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class Tag implements \Reflector -{ - /** - * PCRE regular expression matching a tag name. - */ - const REGEX_TAGNAME = '[\w\-\_\\\\]+'; - - /** @var string Name of the tag */ - protected $tag = ''; - - /** - * @var string|null Content of the tag. - * When set to NULL, it means it needs to be regenerated. - */ - protected $content = ''; - - /** @var string Description of the content of this tag */ - protected $description = ''; - - /** - * @var array|null The description, as an array of strings and Tag objects. - * When set to NULL, it means it needs to be regenerated. - */ - protected $parsedDescription = null; - - /** @var Location Location of the tag. */ - protected $location = null; - - /** @var DocBlock The DocBlock which this tag belongs to. */ - protected $docblock = null; - - /** - * @var array An array with a tag as a key, and an FQCN to a class that - * handles it as an array value. The class is expected to inherit this - * class. - */ - private static $tagHandlerMappings = array( - 'author' - => '\phpDocumentor\Reflection\DocBlock\Tag\AuthorTag', - 'covers' - => '\phpDocumentor\Reflection\DocBlock\Tag\CoversTag', - 'deprecated' - => '\phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag', - 'example' - => '\phpDocumentor\Reflection\DocBlock\Tag\ExampleTag', - 'link' - => '\phpDocumentor\Reflection\DocBlock\Tag\LinkTag', - 'method' - => '\phpDocumentor\Reflection\DocBlock\Tag\MethodTag', - 'param' - => '\phpDocumentor\Reflection\DocBlock\Tag\ParamTag', - 'property-read' - => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyReadTag', - 'property' - => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyTag', - 'property-write' - => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyWriteTag', - 'return' - => '\phpDocumentor\Reflection\DocBlock\Tag\ReturnTag', - 'see' - => '\phpDocumentor\Reflection\DocBlock\Tag\SeeTag', - 'since' - => '\phpDocumentor\Reflection\DocBlock\Tag\SinceTag', - 'source' - => '\phpDocumentor\Reflection\DocBlock\Tag\SourceTag', - 'throw' - => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag', - 'throws' - => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag', - 'uses' - => '\phpDocumentor\Reflection\DocBlock\Tag\UsesTag', - 'var' - => '\phpDocumentor\Reflection\DocBlock\Tag\VarTag', - 'version' - => '\phpDocumentor\Reflection\DocBlock\Tag\VersionTag' - ); - - /** - * Factory method responsible for instantiating the correct sub type. - * - * @param string $tag_line The text for this tag, including description. - * @param DocBlock $docblock The DocBlock which this tag belongs to. - * @param Location $location Location of the tag. - * - * @throws \InvalidArgumentException if an invalid tag line was presented. - * - * @return static A new tag object. - */ - final public static function createInstance( - $tag_line, - DocBlock $docblock = null, - Location $location = null - ) { - if (!preg_match( - '/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us', - $tag_line, - $matches - )) { - throw new \InvalidArgumentException( - 'Invalid tag_line detected: ' . $tag_line - ); - } - - $handler = __CLASS__; - if (isset(self::$tagHandlerMappings[$matches[1]])) { - $handler = self::$tagHandlerMappings[$matches[1]]; - } elseif (isset($docblock)) { - $tagName = (string)new Type\Collection( - array($matches[1]), - $docblock->getContext() - ); - - if (isset(self::$tagHandlerMappings[$tagName])) { - $handler = self::$tagHandlerMappings[$tagName]; - } - } - - return new $handler( - $matches[1], - isset($matches[2]) ? $matches[2] : '', - $docblock, - $location - ); - } - - /** - * Registers a handler for tags. - * - * Registers a handler for tags. The class specified is autoloaded if it's - * not available. It must inherit from this class. - * - * @param string $tag Name of tag to regiser a handler for. When - * registering a namespaced tag, the full name, along with a prefixing - * slash MUST be provided. - * @param string|null $handler FQCN of handler. Specifing NULL removes the - * handler for the specified tag, if any. - * - * @return bool TRUE on success, FALSE on failure. - */ - final public static function registerTagHandler($tag, $handler) - { - $tag = trim((string)$tag); - - if (null === $handler) { - unset(self::$tagHandlerMappings[$tag]); - return true; - } - - if ('' !== $tag - && class_exists($handler, true) - && is_subclass_of($handler, __CLASS__) - && !strpos($tag, '\\') //Accept no slash, and 1st slash at offset 0. - ) { - self::$tagHandlerMappings[$tag] = $handler; - return true; - } - - return false; - } - - /** - * Parses a tag and populates the member variables. - * - * @param string $name Name of the tag. - * @param string $content The contents of the given tag. - * @param DocBlock $docblock The DocBlock which this tag belongs to. - * @param Location $location Location of the tag. - */ - public function __construct( - $name, - $content, - DocBlock $docblock = null, - Location $location = null - ) { - $this - ->setName($name) - ->setContent($content) - ->setDocBlock($docblock) - ->setLocation($location); - } - - /** - * Gets the name of this tag. - * - * @return string The name of this tag. - */ - public function getName() - { - return $this->tag; - } - - /** - * Sets the name of this tag. - * - * @param string $name The new name of this tag. - * - * @return $this - * @throws \InvalidArgumentException When an invalid tag name is provided. - */ - public function setName($name) - { - if (!preg_match('/^' . self::REGEX_TAGNAME . '$/u', $name)) { - throw new \InvalidArgumentException( - 'Invalid tag name supplied: ' . $name - ); - } - - $this->tag = $name; - - return $this; - } - - /** - * Gets the content of this tag. - * - * @return string - */ - public function getContent() - { - if (null === $this->content) { - $this->content = $this->description; - } - - return $this->content; - } - - /** - * Sets the content of this tag. - * - * @param string $content The new content of this tag. - * - * @return $this - */ - public function setContent($content) - { - $this->setDescription($content); - $this->content = $content; - - return $this; - } - - /** - * Gets the description component of this tag. - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the description component of this tag. - * - * @param string $description The new description component of this tag. - * - * @return $this - */ - public function setDescription($description) - { - $this->content = null; - $this->parsedDescription = null; - $this->description = trim($description); - - return $this; - } - - /** - * Gets the parsed text of this description. - * - * @return array An array of strings and tag objects, in the order they - * occur within the description. - */ - public function getParsedDescription() - { - if (null === $this->parsedDescription) { - $description = new Description($this->description, $this->docblock); - $this->parsedDescription = $description->getParsedContents(); - } - return $this->parsedDescription; - } - - /** - * Gets the docblock this tag belongs to. - * - * @return DocBlock The docblock this tag belongs to. - */ - public function getDocBlock() - { - return $this->docblock; - } - - /** - * Sets the docblock this tag belongs to. - * - * @param DocBlock $docblock The new docblock this tag belongs to. Setting - * NULL removes any association. - * - * @return $this - */ - public function setDocBlock(DocBlock $docblock = null) - { - $this->docblock = $docblock; - - return $this; - } - - /** - * Gets the location of the tag. - * - * @return Location The tag's location. - */ - public function getLocation() - { - return $this->location; - } - - /** - * Sets the location of the tag. - * - * @param Location $location The new location of the tag. - * - * @return $this - */ - public function setLocation(Location $location = null) - { - $this->location = $location; - - return $this; - } - - /** - * Builds a string representation of this object. - * - * @todo determine the exact format as used by PHP Reflection and implement it. - * - * @return void - * @codeCoverageIgnore Not yet implemented - */ - public static function export() - { - throw new \Exception('Not yet implemented'); - } - - /** - * Returns the tag as a serialized string - * - * @return string - */ - public function __toString() - { - return "@{$this->getName()} {$this->getContent()}"; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php deleted file mode 100644 index bacf52eb..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php +++ /dev/null @@ -1,131 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for an @author tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class AuthorTag extends Tag -{ - /** - * PCRE regular expression matching any valid value for the name component. - */ - const REGEX_AUTHOR_NAME = '[^\<]*'; - - /** - * PCRE regular expression matching any valid value for the email component. - */ - const REGEX_AUTHOR_EMAIL = '[^\>]*'; - - /** @var string The name of the author */ - protected $authorName = ''; - - /** @var string The email of the author */ - protected $authorEmail = ''; - - public function getContent() - { - if (null === $this->content) { - $this->content = $this->authorName; - if ('' != $this->authorEmail) { - $this->content .= "<{$this->authorEmail}>"; - } - } - - return $this->content; - } - - /** - * {@inheritdoc} - */ - public function setContent($content) - { - parent::setContent($content); - if (preg_match( - '/^(' . self::REGEX_AUTHOR_NAME . - ')(\<(' . self::REGEX_AUTHOR_EMAIL . - ')\>)?$/u', - $this->description, - $matches - )) { - $this->authorName = trim($matches[1]); - if (isset($matches[3])) { - $this->authorEmail = trim($matches[3]); - } - } - - return $this; - } - - /** - * Gets the author's name. - * - * @return string The author's name. - */ - public function getAuthorName() - { - return $this->authorName; - } - - /** - * Sets the author's name. - * - * @param string $authorName The new author name. - * An invalid value will set an empty string. - * - * @return $this - */ - public function setAuthorName($authorName) - { - $this->content = null; - $this->authorName - = preg_match('/^' . self::REGEX_AUTHOR_NAME . '$/u', $authorName) - ? $authorName : ''; - - return $this; - } - - /** - * Gets the author's email. - * - * @return string The author's email. - */ - public function getAuthorEmail() - { - return $this->authorEmail; - } - - /** - * Sets the author's email. - * - * @param string $authorEmail The new author email. - * An invalid value will set an empty string. - * - * @return $this - */ - public function setAuthorEmail($authorEmail) - { - $this->authorEmail - = preg_match('/^' . self::REGEX_AUTHOR_EMAIL . '$/u', $authorEmail) - ? $authorEmail : ''; - - $this->content = null; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php deleted file mode 100644 index bd31b56b..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @covers tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class CoversTag extends SeeTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php deleted file mode 100644 index 7226316b..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag\VersionTag; - -/** - * Reflection class for a @deprecated tag in a Docblock. - * - * @author Vasil Rangelov - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class DeprecatedTag extends VersionTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php deleted file mode 100644 index 0e163ea0..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php +++ /dev/null @@ -1,156 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @example tag in a Docblock. - * - * @author Vasil Rangelov - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ExampleTag extends SourceTag -{ - /** - * @var string Path to a file to use as an example. - * May also be an absolute URI. - */ - protected $filePath = ''; - - /** - * @var bool Whether the file path component represents an URI. - * This determines how the file portion appears at {@link getContent()}. - */ - protected $isURI = false; - - /** - * {@inheritdoc} - */ - public function getContent() - { - if (null === $this->content) { - $filePath = ''; - if ($this->isURI) { - if (false === strpos($this->filePath, ':')) { - $filePath = str_replace( - '%2F', - '/', - rawurlencode($this->filePath) - ); - } else { - $filePath = $this->filePath; - } - } else { - $filePath = '"' . $this->filePath . '"'; - } - - $this->content = $filePath . ' ' . parent::getContent(); - } - - return $this->content; - } - /** - * {@inheritdoc} - */ - public function setContent($content) - { - Tag::setContent($content); - if (preg_match( - '/^ - # File component - (?: - # File path in quotes - \"([^\"]+)\" - | - # File URI - (\S+) - ) - # Remaining content (parsed by SourceTag) - (?:\s+(.*))? - $/sux', - $this->description, - $matches - )) { - if ('' !== $matches[1]) { - $this->setFilePath($matches[1]); - } else { - $this->setFileURI($matches[2]); - } - - if (isset($matches[3])) { - parent::setContent($matches[3]); - } else { - $this->setDescription(''); - } - $this->content = $content; - } - - return $this; - } - - /** - * Returns the file path. - * - * @return string Path to a file to use as an example. - * May also be an absolute URI. - */ - public function getFilePath() - { - return $this->filePath; - } - - /** - * Sets the file path. - * - * @param string $filePath The new file path to use for the example. - * - * @return $this - */ - public function setFilePath($filePath) - { - $this->isURI = false; - $this->filePath = trim($filePath); - - $this->content = null; - return $this; - } - - /** - * Sets the file path as an URI. - * - * This function is equivalent to {@link setFilePath()}, except that it - * convers an URI to a file path before that. - * - * There is no getFileURI(), as {@link getFilePath()} is compatible. - * - * @param type $uri The new file URI to use as an example. - */ - public function setFileURI($uri) - { - $this->isURI = true; - if (false === strpos($uri, ':')) { - //Relative URL - $this->filePath = rawurldecode( - str_replace(array('/', '\\'), '%2F', $uri) - ); - } else { - //Absolute URL or URI. - $this->filePath = $uri; - } - - $this->content = null; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php deleted file mode 100644 index f79f25dd..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @link tag in a Docblock. - * - * @author Ben Selby - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class LinkTag extends Tag -{ - /** @var string */ - protected $link = ''; - - /** - * {@inheritdoc} - */ - public function getContent() - { - if (null === $this->content) { - $this->content = "{$this->link} {$this->description}"; - } - - return $this->content; - } - - /** - * {@inheritdoc} - */ - public function setContent($content) - { - parent::setContent($content); - $parts = preg_split('/\s+/Su', $this->description, 2); - - $this->link = $parts[0]; - - $this->setDescription(isset($parts[1]) ? $parts[1] : $parts[0]); - - $this->content = $content; - return $this; - } - - /** - * Gets the link - * - * @return string - */ - public function getLink() - { - return $this->link; - } - - /** - * Sets the link - * - * @param string $link The link - * - * @return $this - */ - public function setLink($link) - { - $this->link = $link; - - $this->content = null; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php deleted file mode 100644 index 7a5ce790..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php +++ /dev/null @@ -1,209 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @method in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class MethodTag extends ReturnTag -{ - - /** @var string */ - protected $method_name = ''; - - /** @var string */ - protected $arguments = ''; - - /** @var bool */ - protected $isStatic = false; - - /** - * {@inheritdoc} - */ - public function getContent() - { - if (null === $this->content) { - $this->content = ''; - if ($this->isStatic) { - $this->content .= 'static '; - } - $this->content .= $this->type . - " {$this->method_name}({$this->arguments}) " . - $this->description; - } - - return $this->content; - } - - /** - * {@inheritdoc} - */ - public function setContent($content) - { - Tag::setContent($content); - // 1. none or more whitespace - // 2. optionally the keyword "static" followed by whitespace - // 3. optionally a word with underscores followed by whitespace : as - // type for the return value - // 4. then optionally a word with underscores followed by () and - // whitespace : as method name as used by phpDocumentor - // 5. then a word with underscores, followed by ( and any character - // until a ) and whitespace : as method name with signature - // 6. any remaining text : as description - if (preg_match( - '/^ - # Static keyword - # Declates a static method ONLY if type is also present - (?: - (static) - \s+ - )? - # Return type - (?: - ([\w\|_\\\\]+) - \s+ - )? - # Legacy method name (not captured) - (?: - [\w_]+\(\)\s+ - )? - # Method name - ([\w\|_\\\\]+) - # Arguments - \(([^\)]*)\) - \s* - # Description - (.*) - $/sux', - $this->description, - $matches - )) { - list( - , - $static, - $this->type, - $this->method_name, - $this->arguments, - $this->description - ) = $matches; - if ($static) { - if (!$this->type) { - $this->type = 'static'; - } else { - $this->isStatic = true; - } - } else { - if (!$this->type) { - $this->type = 'void'; - } - } - $this->parsedDescription = null; - } - - return $this; - } - - /** - * Sets the name of this method. - * - * @param string $method_name The name of the method. - * - * @return $this - */ - public function setMethodName($method_name) - { - $this->method_name = $method_name; - - $this->content = null; - return $this; - } - - /** - * Retrieves the method name. - * - * @return string - */ - public function getMethodName() - { - return $this->method_name; - } - - /** - * Sets the arguments for this method. - * - * @param string $arguments A comma-separated arguments line. - * - * @return void - */ - public function setArguments($arguments) - { - $this->arguments = $arguments; - - $this->content = null; - return $this; - } - - /** - * Returns an array containing each argument as array of type and name. - * - * Please note that the argument sub-array may only contain 1 element if no - * type was specified. - * - * @return string[] - */ - public function getArguments() - { - if (empty($this->arguments)) { - return array(); - } - - $arguments = explode(',', $this->arguments); - foreach ($arguments as $key => $value) { - $arguments[$key] = explode(' ', trim($value)); - } - - return $arguments; - } - - /** - * Checks whether the method tag describes a static method or not. - * - * @return bool TRUE if the method declaration is for a static method, FALSE - * otherwise. - */ - public function isStatic() - { - return $this->isStatic; - } - - /** - * Sets a new value for whether the method is static or not. - * - * @param bool $isStatic The new value to set. - * - * @return $this - */ - public function setIsStatic($isStatic) - { - $this->isStatic = $isStatic; - - $this->content = null; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php deleted file mode 100644 index 9bc0270d..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php +++ /dev/null @@ -1,119 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @param tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ParamTag extends ReturnTag -{ - /** @var string */ - protected $variableName = ''; - - /** @var bool determines whether this is a variadic argument */ - protected $isVariadic = false; - - /** - * {@inheritdoc} - */ - public function getContent() - { - if (null === $this->content) { - $this->content - = "{$this->type} {$this->variableName} {$this->description}"; - } - return $this->content; - } - /** - * {@inheritdoc} - */ - public function setContent($content) - { - Tag::setContent($content); - $parts = preg_split( - '/(\s+)/Su', - $this->description, - 3, - PREG_SPLIT_DELIM_CAPTURE - ); - - // if the first item that is encountered is not a variable; it is a type - if (isset($parts[0]) - && (strlen($parts[0]) > 0) - && ($parts[0][0] !== '$') - ) { - $this->type = array_shift($parts); - array_shift($parts); - } - - // if the next item starts with a $ or ...$ it must be the variable name - if (isset($parts[0]) - && (strlen($parts[0]) > 0) - && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$') - ) { - $this->variableName = array_shift($parts); - array_shift($parts); - - if (substr($this->variableName, 0, 3) === '...') { - $this->isVariadic = true; - $this->variableName = substr($this->variableName, 3); - } - } - - $this->setDescription(implode('', $parts)); - - $this->content = $content; - return $this; - } - - /** - * Returns the variable's name. - * - * @return string - */ - public function getVariableName() - { - return $this->variableName; - } - - /** - * Sets the variable's name. - * - * @param string $name The new name for this variable. - * - * @return $this - */ - public function setVariableName($name) - { - $this->variableName = $name; - - $this->content = null; - return $this; - } - - /** - * Returns whether this tag is variadic. - * - * @return boolean - */ - public function isVariadic() - { - return $this->isVariadic; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php deleted file mode 100644 index 33406026..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @property-read tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class PropertyReadTag extends PropertyTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php deleted file mode 100644 index 288ecff8..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @property tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class PropertyTag extends ParamTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php deleted file mode 100644 index ec4e866d..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @property-write tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class PropertyWriteTag extends PropertyTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php deleted file mode 100644 index 9293db92..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; -use phpDocumentor\Reflection\DocBlock\Type\Collection; - -/** - * Reflection class for a @return tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ReturnTag extends Tag -{ - /** @var string The raw type component. */ - protected $type = ''; - - /** @var Collection The parsed type component. */ - protected $types = null; - - /** - * {@inheritdoc} - */ - public function getContent() - { - if (null === $this->content) { - $this->content = "{$this->type} {$this->description}"; - } - - return $this->content; - } - - /** - * {@inheritdoc} - */ - public function setContent($content) - { - parent::setContent($content); - - $parts = preg_split('/\s+/Su', $this->description, 2); - - // any output is considered a type - $this->type = $parts[0]; - $this->types = null; - - $this->setDescription(isset($parts[1]) ? $parts[1] : ''); - - $this->content = $content; - return $this; - } - - /** - * Returns the unique types of the variable. - * - * @return string[] - */ - public function getTypes() - { - return $this->getTypesCollection()->getArrayCopy(); - } - - /** - * Returns the type section of the variable. - * - * @return string - */ - public function getType() - { - return (string) $this->getTypesCollection(); - } - - /** - * Returns the type collection. - * - * @return void - */ - protected function getTypesCollection() - { - if (null === $this->types) { - $this->types = new Collection( - array($this->type), - $this->docblock ? $this->docblock->getContext() : null - ); - } - return $this->types; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php deleted file mode 100644 index 4f5f22ce..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @see tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class SeeTag extends Tag -{ - /** @var string */ - protected $refers = null; - - /** - * {@inheritdoc} - */ - public function getContent() - { - if (null === $this->content) { - $this->content = "{$this->refers} {$this->description}"; - } - return $this->content; - } - - /** - * {@inheritdoc} - */ - public function setContent($content) - { - parent::setContent($content); - $parts = preg_split('/\s+/Su', $this->description, 2); - - // any output is considered a type - $this->refers = $parts[0]; - - $this->setDescription(isset($parts[1]) ? $parts[1] : ''); - - $this->content = $content; - return $this; - } - - /** - * Gets the structural element this tag refers to. - * - * @return string - */ - public function getReference() - { - return $this->refers; - } - - /** - * Sets the structural element this tag refers to. - * - * @param string $refers The new type this tag refers to. - * - * @return $this - */ - public function setReference($refers) - { - $this->refers = $refers; - - $this->content = null; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php deleted file mode 100644 index ba009c44..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag\VersionTag; - -/** - * Reflection class for a @since tag in a Docblock. - * - * @author Vasil Rangelov - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class SinceTag extends VersionTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php deleted file mode 100644 index 3400220e..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php +++ /dev/null @@ -1,137 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @source tag in a Docblock. - * - * @author Vasil Rangelov - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class SourceTag extends Tag -{ - /** - * @var int The starting line, relative to the structural element's - * location. - */ - protected $startingLine = 1; - - /** - * @var int|null The number of lines, relative to the starting line. NULL - * means "to the end". - */ - protected $lineCount = null; - - /** - * {@inheritdoc} - */ - public function getContent() - { - if (null === $this->content) { - $this->content - = "{$this->startingLine} {$this->lineCount} {$this->description}"; - } - - return $this->content; - } - - /** - * {@inheritdoc} - */ - public function setContent($content) - { - parent::setContent($content); - if (preg_match( - '/^ - # Starting line - ([1-9]\d*) - \s* - # Number of lines - (?: - ((?1)) - \s+ - )? - # Description - (.*) - $/sux', - $this->description, - $matches - )) { - $this->startingLine = (int)$matches[1]; - if (isset($matches[2]) && '' !== $matches[2]) { - $this->lineCount = (int)$matches[2]; - } - $this->setDescription($matches[3]); - $this->content = $content; - } - - return $this; - } - - /** - * Gets the starting line. - * - * @return int The starting line, relative to the structural element's - * location. - */ - public function getStartingLine() - { - return $this->startingLine; - } - - /** - * Sets the starting line. - * - * @param int $startingLine The new starting line, relative to the - * structural element's location. - * - * @return $this - */ - public function setStartingLine($startingLine) - { - $this->startingLine = $startingLine; - - $this->content = null; - return $this; - } - - /** - * Returns the number of lines. - * - * @return int|null The number of lines, relative to the starting line. NULL - * means "to the end". - */ - public function getLineCount() - { - return $this->lineCount; - } - - /** - * Sets the number of lines. - * - * @param int|null $lineCount The new number of lines, relative to the - * starting line. NULL means "to the end". - * - * @return $this - */ - public function setLineCount($lineCount) - { - $this->lineCount = $lineCount; - - $this->content = null; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php deleted file mode 100644 index 58ee44a4..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @throws tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ThrowsTag extends ReturnTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php deleted file mode 100644 index da0d6638..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @uses tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class UsesTag extends SeeTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php deleted file mode 100644 index 236b2c8b..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @var tag in a Docblock. - * - * @author Mike van Riel - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class VarTag extends ParamTag -{ -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php deleted file mode 100644 index 260f6984..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -use phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Reflection class for a @version tag in a Docblock. - * - * @author Vasil Rangelov - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class VersionTag extends Tag -{ - /** - * PCRE regular expression matching a version vector. - * Assumes the "x" modifier. - */ - const REGEX_VECTOR = '(?: - # Normal release vectors. - \d\S* - | - # VCS version vectors. Per PHPCS, they are expected to - # follow the form of the VCS name, followed by ":", followed - # by the version vector itself. - # By convention, popular VCSes like CVS, SVN and GIT use "$" - # around the actual version vector. - [^\s\:]+\:\s*\$[^\$]+\$ - )'; - - /** @var string The version vector. */ - protected $version = ''; - - public function getContent() - { - if (null === $this->content) { - $this->content = "{$this->version} {$this->description}"; - } - - return $this->content; - } - - /** - * {@inheritdoc} - */ - public function setContent($content) - { - parent::setContent($content); - - if (preg_match( - '/^ - # The version vector - (' . self::REGEX_VECTOR . ') - \s* - # The description - (.+)? - $/sux', - $this->description, - $matches - )) { - $this->version = $matches[1]; - $this->setDescription(isset($matches[2]) ? $matches[2] : ''); - $this->content = $content; - } - - return $this; - } - - /** - * Gets the version section of the tag. - * - * @return string The version section of the tag. - */ - public function getVersion() - { - return $this->version; - } - - /** - * Sets the version section of the tag. - * - * @param string $version The new version section of the tag. - * An invalid value will set an empty string. - * - * @return $this - */ - public function setVersion($version) - { - $this->version - = preg_match('/^' . self::REGEX_VECTOR . '$/ux', $version) - ? $version - : ''; - - $this->content = null; - return $this; - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php deleted file mode 100644 index 90ead3ff..00000000 --- a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php +++ /dev/null @@ -1,221 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Type; - -use phpDocumentor\Reflection\DocBlock\Context; - -/** - * Collection - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class Collection extends \ArrayObject -{ - /** @var string Definition of the OR operator for types */ - const OPERATOR_OR = '|'; - - /** @var string Definition of the ARRAY operator for types */ - const OPERATOR_ARRAY = '[]'; - - /** @var string Definition of the NAMESPACE operator in PHP */ - const OPERATOR_NAMESPACE = '\\'; - - /** @var string[] List of recognized keywords */ - protected static $keywords = array( - 'string', 'int', 'integer', 'bool', 'boolean', 'float', 'double', - 'object', 'mixed', 'array', 'resource', 'void', 'null', 'scalar', - 'callback', 'callable', 'false', 'true', 'self', '$this', 'static' - ); - - /** - * Current invoking location. - * - * This is used to prepend to type with a relative location. - * May also be 'default' or 'global', in which case they are ignored. - * - * @var Context - */ - protected $context = null; - - /** - * Registers the namespace and aliases; uses that to add and expand the - * given types. - * - * @param string[] $types Array containing a list of types to add to this - * container. - * @param Context $location The current invoking location. - */ - public function __construct( - array $types = array(), - Context $context = null - ) { - $this->context = null === $context ? new Context() : $context; - - foreach ($types as $type) { - $this->add($type); - } - } - - /** - * Returns the current invoking location. - * - * @return Context - */ - public function getContext() - { - return $this->context; - } - - /** - * Adds a new type to the collection and expands it if it contains a - * relative namespace. - * - * If a class in the type contains a relative namespace than this collection - * will try to expand that into a FQCN. - * - * @param string $type A 'Type' as defined in the phpDocumentor - * documentation. - * - * @throws \InvalidArgumentException if a non-string argument is passed. - * - * @see http://phpdoc.org/docs/latest/for-users/types.html for the - * definition of a type. - * - * @return void - */ - public function add($type) - { - if (!is_string($type)) { - throw new \InvalidArgumentException( - 'A type should be represented by a string, received: ' - .var_export($type, true) - ); - } - - // separate the type by the OR operator - $type_parts = explode(self::OPERATOR_OR, $type); - foreach ($type_parts as $part) { - $expanded_type = $this->expand($part); - if ($expanded_type) { - $this[] = $expanded_type; - } - } - } - - /** - * Returns a string representation of the collection. - * - * @return string The resolved types across the collection, separated with - * {@link self::OPERATOR_OR}. - */ - public function __toString() - { - return implode(self::OPERATOR_OR, $this->getArrayCopy()); - } - - /** - * Analyzes the given type and returns the FQCN variant. - * - * When a type is provided this method checks whether it is not a keyword or - * Fully Qualified Class Name. If so it will use the given namespace and - * aliases to expand the type to a FQCN representation. - * - * This method only works as expected if the namespace and aliases are set; - * no dynamic reflection is being performed here. - * - * @param string $type The relative or absolute type. - * - * @uses getNamespace to determine with what to prefix the type name. - * @uses getNamespaceAliases to check whether the first part of the relative - * type name should not be replaced with another namespace. - * - * @return string - */ - protected function expand($type) - { - $type = trim($type); - if (!$type) { - return ''; - } - - if ($this->isTypeAnArray($type)) { - return $this->expand(substr($type, 0, -2)) . self::OPERATOR_ARRAY; - } - - if ($this->isRelativeType($type) && !$this->isTypeAKeyword($type)) { - $type_parts = explode(self::OPERATOR_NAMESPACE, $type, 2); - - $namespace_aliases = $this->context->getNamespaceAliases(); - // if the first segment is not an alias; prepend namespace name and - // return - if (!isset($namespace_aliases[$type_parts[0]])) { - $namespace = $this->context->getNamespace(); - if ('' !== $namespace) { - $namespace .= self::OPERATOR_NAMESPACE; - } - return self::OPERATOR_NAMESPACE . $namespace . $type; - } - - $type_parts[0] = $namespace_aliases[$type_parts[0]]; - $type = implode(self::OPERATOR_NAMESPACE, $type_parts); - } - - return $type; - } - - /** - * Detects whether the given type represents an array. - * - * @param string $type A relative or absolute type as defined in the - * phpDocumentor documentation. - * - * @return bool - */ - protected function isTypeAnArray($type) - { - return substr($type, -2) === self::OPERATOR_ARRAY; - } - - /** - * Detects whether the given type represents a PHPDoc keyword. - * - * @param string $type A relative or absolute type as defined in the - * phpDocumentor documentation. - * - * @return bool - */ - protected function isTypeAKeyword($type) - { - return in_array(strtolower($type), static::$keywords, true); - } - - /** - * Detects whether the given type represents a relative or absolute path. - * - * This method will detect keywords as being absolute; even though they are - * not preceeded by a namespace separator. - * - * @param string $type A relative or absolute type as defined in the - * phpDocumentor documentation. - * - * @return bool - */ - protected function isRelativeType($type) - { - return ($type[0] !== self::OPERATOR_NAMESPACE) - || $this->isTypeAKeyword($type); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/integration/InterpretingDocBlocksTest.php b/vendor/phpdocumentor/reflection-docblock/tests/integration/InterpretingDocBlocksTest.php new file mode 100644 index 00000000..91b8eb36 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/integration/InterpretingDocBlocksTest.php @@ -0,0 +1,97 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\StandardTagFactory; +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\Tags\See; + +/** + * @coversNothing + */ +class InterpretingDocBlocksTest extends \PHPUnit_Framework_TestCase +{ + public function testInterpretingASimpleDocBlock() + { + /** + * @var DocBlock $docblock + * @var string $summary + * @var Description $description + */ + include(__DIR__ . '/../../examples/01-interpreting-a-simple-docblock.php'); + + $descriptionText = <<assertInstanceOf(DocBlock::class, $docblock); + $this->assertSame('This is an example of a summary.', $summary); + $this->assertInstanceOf(Description::class, $description); + $this->assertSame($descriptionText, $description->render()); + $this->assertEmpty($docblock->getTags()); + } + + public function testInterpretingTags() + { + /** + * @var DocBlock $docblock + * @var boolean $hasSeeTag + * @var Tag[] $tags + * @var See[] $seeTags + */ + include(__DIR__ . '/../../examples/02-interpreting-tags.php'); + + $this->assertTrue($hasSeeTag); + $this->assertCount(1, $tags); + $this->assertCount(1, $seeTags); + + $this->assertInstanceOf(See::class, $tags[0]); + $this->assertInstanceOf(See::class, $seeTags[0]); + + $seeTag = $seeTags[0]; + $this->assertSame('\\' . StandardTagFactory::class, (string)$seeTag->getReference()); + $this->assertSame('', (string)$seeTag->getDescription()); + } + + public function testDescriptionsCanEscapeAtSignsAndClosingBraces() + { + /** + * @var string $docComment + * @var DocBlock $docblock + * @var Description $description + * @var string $receivedDocComment + * @var string $foundDescription + */ + + include(__DIR__ . '/../../examples/playing-with-descriptions/02-escaping.php'); + $this->assertSame(<<<'DESCRIPTION' +You can escape the @-sign by surrounding it with braces, for example: @. And escape a closing brace within an +inline tag by adding an opening brace in front of it like this: }. + +Here are example texts where you can see how they could be used in a real life situation: + + This is a text with an {@internal inline tag where a closing brace (}) is shown}. + Or an {@internal inline tag with a literal {@link} in it}. + +Do note that an {@internal inline tag that has an opening brace ({) does not break out}. +DESCRIPTION + , + $foundDescription + ) + ; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php b/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php new file mode 100644 index 00000000..92ac22ed --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php @@ -0,0 +1,35 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\StandardTagFactory; +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\Tags\See; + +/** + * @coversNothing + */ +class ReconstitutingADocBlockTest extends \PHPUnit_Framework_TestCase +{ + public function testReconstituteADocBlock() + { + /** + * @var string $docComment + * @var string $reconstitutedDocComment + */ + include(__DIR__ . '/../../examples/03-reconstituting-a-docblock.php'); + + $this->assertSame($docComment, $reconstitutedDocComment); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php b/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php new file mode 100644 index 00000000..984811b1 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php @@ -0,0 +1,39 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\StandardTagFactory; +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\Tags\See; + +/** + * @coversNothing + */ +class UsingTagsTest extends \PHPUnit_Framework_TestCase +{ + public function testAddingYourOwnTagUsingAStaticMethodAsFactory() + { + /** + * @var object[] $customTagObjects + * @var string $docComment + * @var string $reconstitutedDocComment + */ + include(__DIR__ . '/../../examples/04-adding-your-own-tag.php'); + + $this->assertInstanceOf(\MyTag::class, $customTagObjects[0]); + $this->assertSame('my-tag', $customTagObjects[0]->getName()); + $this->assertSame('I have a description', (string)$customTagObjects[0]->getDescription()); + $this->assertSame($docComment, $reconstitutedDocComment); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php deleted file mode 100644 index a6ca7b37..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php +++ /dev/null @@ -1,245 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Description - * - * @author Vasil Rangelov - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class DescriptionTest extends \PHPUnit_Framework_TestCase -{ - public function testConstruct() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(1, $parsedContents); - $this->assertSame($fixture, $parsedContents[0]); - } - - public function testInlineTagParsing() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(3, $parsedContents); - $this->assertSame('This is text for a ', $parsedContents[0]); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag\LinkTag', - $parsedContents[1] - ); - $this->assertSame( - ' that uses inline -tags.', - $parsedContents[2] - ); - } - - public function testInlineTagAtStartParsing() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(3, $parsedContents); - - $this->assertSame('', $parsedContents[0]); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag\LinkTag', - $parsedContents[1] - ); - $this->assertSame( - ' is text for a description that uses inline -tags.', - $parsedContents[2] - ); - } - - public function testNestedInlineTagParsing() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(3, $parsedContents); - - $this->assertSame( - 'This is text for a description with ', - $parsedContents[0] - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $parsedContents[1] - ); - $this->assertSame('.', $parsedContents[2]); - - $parsedDescription = $parsedContents[1]->getParsedDescription(); - $this->assertCount(3, $parsedDescription); - $this->assertSame("inline tag with\n", $parsedDescription[0]); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag\LinkTag', - $parsedDescription[1] - ); - $this->assertSame(' in it', $parsedDescription[2]); - } - - public function testLiteralOpeningDelimiter() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(1, $parsedContents); - $this->assertSame($fixture, $parsedContents[0]); - } - - public function testNestedLiteralOpeningDelimiter() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(3, $parsedContents); - $this->assertSame( - 'This is text for a description containing ', - $parsedContents[0] - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $parsedContents[1] - ); - $this->assertSame('.', $parsedContents[2]); - - $this->assertSame( - array('inline tag that has { that -is literal'), - $parsedContents[1]->getParsedDescription() - ); - } - - public function testLiteralClosingDelimiter() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(1, $parsedContents); - $this->assertSame( - 'This is text for a description with } that is not a tag.', - $parsedContents[0] - ); - } - - public function testNestedLiteralClosingDelimiter() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(3, $parsedContents); - $this->assertSame( - 'This is text for a description with ', - $parsedContents[0] - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $parsedContents[1] - ); - $this->assertSame('.', $parsedContents[2]); - - $this->assertSame( - array('inline tag with } that is not an -inline tag'), - $parsedContents[1]->getParsedDescription() - ); - } - - public function testInlineTagEscapingSequence() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(1, $parsedContents); - $this->assertSame( - 'This is text for a description with literal {@link}.', - $parsedContents[0] - ); - } - - public function testNestedInlineTagEscapingSequence() - { - $fixture = <<assertSame($fixture, $object->getContents()); - - $parsedContents = $object->getParsedContents(); - $this->assertCount(3, $parsedContents); - $this->assertSame( - 'This is text for a description with an ', - $parsedContents[0] - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $parsedContents[1] - ); - $this->assertSame('.', $parsedContents[2]); - - $this->assertSame( - array('inline tag with literal -{@link} in it'), - $parsedContents[1]->getParsedDescription() - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php deleted file mode 100644 index ff257aa1..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\CoversTag - * - * @author Daniel O'Connor - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class CoversTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\CoversTag can create - * a link for the covers doc block. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exReference - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\CoversTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exReference - ) { - $tag = new CoversTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exReference, $tag->getReference()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exReference - return array( - array( - 'covers', - 'Foo::bar()', - 'Foo::bar()', - '', - 'Foo::bar()' - ), - array( - 'covers', - 'Foo::bar() Testing', - 'Foo::bar() Testing', - 'Testing', - 'Foo::bar()', - ), - array( - 'covers', - 'Foo::bar() Testing comments', - 'Foo::bar() Testing comments', - 'Testing comments', - 'Foo::bar()', - ), - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php deleted file mode 100644 index 7a75e79c..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag - * - * @author Vasil Rangelov - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class DeprecatedTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create - * a link for the @deprecated doc block. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exDescription - * @param string $exVersion - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exVersion - ) { - $tag = new DeprecatedTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exVersion, $tag->getVersion()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exVersion - return array( - array( - 'deprecated', - '1.0 First release.', - '1.0 First release.', - 'First release.', - '1.0' - ), - array( - 'deprecated', - "1.0\nFirst release.", - "1.0\nFirst release.", - 'First release.', - '1.0' - ), - array( - 'deprecated', - "1.0\nFirst\nrelease.", - "1.0\nFirst\nrelease.", - "First\nrelease.", - '1.0' - ), - array( - 'deprecated', - 'Unfinished release', - 'Unfinished release', - 'Unfinished release', - '' - ), - array( - 'deprecated', - '1.0', - '1.0', - '', - '1.0' - ), - array( - 'deprecated', - 'GIT: $Id$', - 'GIT: $Id$', - '', - 'GIT: $Id$' - ), - array( - 'deprecated', - 'GIT: $Id$ Dev build', - 'GIT: $Id$ Dev build', - 'Dev build', - 'GIT: $Id$' - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php deleted file mode 100644 index 519a61b3..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php +++ /dev/null @@ -1,203 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag - * - * @author Vasil Rangelov - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ExampleTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can - * understand the @source DocBlock. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exStartingLine - * @param string $exLineCount - * @param string $exFilepath - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exStartingLine, - $exLineCount, - $exFilePath - ) { - $tag = new ExampleTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exStartingLine, $tag->getStartingLine()); - $this->assertEquals($exLineCount, $tag->getLineCount()); - $this->assertEquals($exFilePath, $tag->getFilePath()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, - // $content, - // $exContent, - // $exDescription, - // $exStartingLine, - // $exLineCount, - // $exFilePath - return array( - array( - 'example', - 'file.php', - 'file.php', - '', - 1, - null, - 'file.php' - ), - array( - 'example', - 'Testing comments', - 'Testing comments', - 'comments', - 1, - null, - 'Testing' - ), - array( - 'example', - 'file.php 2 Testing', - 'file.php 2 Testing', - 'Testing', - 2, - null, - 'file.php' - ), - array( - 'example', - 'file.php 2 3 Testing comments', - 'file.php 2 3 Testing comments', - 'Testing comments', - 2, - 3, - 'file.php' - ), - array( - 'example', - 'file.php 2 -1 Testing comments', - 'file.php 2 -1 Testing comments', - '-1 Testing comments', - 2, - null, - 'file.php' - ), - array( - 'example', - 'file.php -1 1 Testing comments', - 'file.php -1 1 Testing comments', - '-1 1 Testing comments', - 1, - null, - 'file.php' - ), - array( - 'example', - '"file with spaces.php" Testing comments', - '"file with spaces.php" Testing comments', - 'Testing comments', - 1, - null, - 'file with spaces.php' - ), - array( - 'example', - '"file with spaces.php" 2 Testing comments', - '"file with spaces.php" 2 Testing comments', - 'Testing comments', - 2, - null, - 'file with spaces.php' - ), - array( - 'example', - '"file with spaces.php" 2 3 Testing comments', - '"file with spaces.php" 2 3 Testing comments', - 'Testing comments', - 2, - 3, - 'file with spaces.php' - ), - array( - 'example', - '"file with spaces.php" 2 -3 Testing comments', - '"file with spaces.php" 2 -3 Testing comments', - '-3 Testing comments', - 2, - null, - 'file with spaces.php' - ), - array( - 'example', - '"file with spaces.php" -2 3 Testing comments', - '"file with spaces.php" -2 3 Testing comments', - '-2 3 Testing comments', - 1, - null, - 'file with spaces.php' - ), - array( - 'example', - 'file%20with%20spaces.php Testing comments', - 'file%20with%20spaces.php Testing comments', - 'Testing comments', - 1, - null, - 'file with spaces.php' - ), - array( - 'example', - 'folder/file%20with%20spaces.php Testing comments', - 'folder/file%20with%20spaces.php Testing comments', - 'Testing comments', - 1, - null, - 'folder/file with spaces.php' - ), - array( - 'example', - 'http://example.com/file%20with%20spaces.php Testing comments', - 'http://example.com/file%20with%20spaces.php Testing comments', - 'Testing comments', - 1, - null, - 'http://example.com/file%20with%20spaces.php' - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php deleted file mode 100644 index 0c64ed08..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\LinkTag - * - * @author Ben Selby - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class LinkTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create - * a link for the @link doc block. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exDescription - * @param string $exLink - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\LinkTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exLink - ) { - $tag = new LinkTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exLink, $tag->getLink()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exLink - return array( - array( - 'link', - 'http://www.phpdoc.org/', - 'http://www.phpdoc.org/', - 'http://www.phpdoc.org/', - 'http://www.phpdoc.org/' - ), - array( - 'link', - 'http://www.phpdoc.org/ Testing', - 'http://www.phpdoc.org/ Testing', - 'Testing', - 'http://www.phpdoc.org/' - ), - array( - 'link', - 'http://www.phpdoc.org/ Testing comments', - 'http://www.phpdoc.org/ Testing comments', - 'Testing comments', - 'http://www.phpdoc.org/' - ), - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php deleted file mode 100644 index efc3a15b..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php +++ /dev/null @@ -1,146 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\MethodTag - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class MethodTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * @param string $signature The signature to test. - * @param bool $valid Whether the given signature is expected to - * be valid. - * @param string $expected_name The method name that is expected from this - * signature. - * @param string $expected_return The return type that is expected from this - * signature. - * @param bool $paramCount Number of parameters in the signature. - * @param string $description The short description mentioned in the - * signature. - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\MethodTag - * @dataProvider getTestSignatures - * - * @return void - */ - public function testConstruct( - $signature, - $valid, - $expected_name, - $expected_return, - $expected_isStatic, - $paramCount, - $description - ) { - ob_start(); - $tag = new MethodTag('method', $signature); - $stdout = ob_get_clean(); - - $this->assertSame( - $valid, - empty($stdout), - 'No error should have been output if the signature is valid' - ); - - if (!$valid) { - return; - } - - $this->assertEquals($expected_name, $tag->getMethodName()); - $this->assertEquals($expected_return, $tag->getType()); - $this->assertEquals($description, $tag->getDescription()); - $this->assertEquals($expected_isStatic, $tag->isStatic()); - $this->assertCount($paramCount, $tag->getArguments()); - } - - public function getTestSignatures() - { - return array( - // TODO: Verify this case -// array( -// 'foo', -// false, 'foo', '', false, 0, '' -// ), - array( - 'foo()', - true, 'foo', 'void', false, 0, '' - ), - array( - 'foo() description', - true, 'foo', 'void', false, 0, 'description' - ), - array( - 'int foo()', - true, 'foo', 'int', false, 0, '' - ), - array( - 'int foo() description', - true, 'foo', 'int', false, 0, 'description' - ), - array( - 'int foo($a, $b)', - true, 'foo', 'int', false, 2, '' - ), - array( - 'int foo() foo(int $a, int $b)', - true, 'foo', 'int', false, 2, '' - ), - array( - 'int foo(int $a, int $b)', - true, 'foo', 'int', false, 2, '' - ), - array( - 'null|int foo(int $a, int $b)', - true, 'foo', 'null|int', false, 2, '' - ), - array( - 'int foo(null|int $a, int $b)', - true, 'foo', 'int', false, 2, '' - ), - array( - '\Exception foo() foo(Exception $a, Exception $b)', - true, 'foo', '\Exception', false, 2, '' - ), - array( - 'int foo() foo(Exception $a, Exception $b) description', - true, 'foo', 'int', false, 2, 'description' - ), - array( - 'int foo() foo(\Exception $a, \Exception $b) description', - true, 'foo', 'int', false, 2, 'description' - ), - array( - 'void()', - true, 'void', 'void', false, 0, '' - ), - array( - 'static foo()', - true, 'foo', 'static', false, 0, '' - ), - array( - 'static void foo()', - true, 'foo', 'void', true, 0, '' - ), - array( - 'static static foo()', - true, 'foo', 'static', true, 0, '' - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php deleted file mode 100644 index 0e05382f..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php +++ /dev/null @@ -1,118 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\ParamTag - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ParamTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ParamTag can - * understand the @param DocBlock. - * - * @param string $type - * @param string $content - * @param string $extractedType - * @param string $extractedTypes - * @param string $extractedVarName - * @param string $extractedDescription - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\ParamTag - * @dataProvider provideDataForConstructor - * - * @return void - */ - public function testConstructorParsesInputsIntoCorrectFields( - $type, - $content, - $extractedType, - $extractedTypes, - $extractedVarName, - $extractedDescription - ) { - $tag = new ParamTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($extractedType, $tag->getType()); - $this->assertEquals($extractedTypes, $tag->getTypes()); - $this->assertEquals($extractedVarName, $tag->getVariableName()); - $this->assertEquals($extractedDescription, $tag->getDescription()); - } - - /** - * Data provider for testConstructorParsesInputsIntoCorrectFields() - * - * @return array - */ - public function provideDataForConstructor() - { - return array( - array('param', 'int', 'int', array('int'), '', ''), - array('param', '$bob', '', array(), '$bob', ''), - array( - 'param', - 'int Number of bobs', - 'int', - array('int'), - '', - 'Number of bobs' - ), - array( - 'param', - 'int $bob', - 'int', - array('int'), - '$bob', - '' - ), - array( - 'param', - 'int $bob Number of bobs', - 'int', - array('int'), - '$bob', - 'Number of bobs' - ), - array( - 'param', - "int Description \n on multiple lines", - 'int', - array('int'), - '', - "Description \n on multiple lines" - ), - array( - 'param', - "int \n\$bob Variable name on a new line", - 'int', - array('int'), - '$bob', - "Variable name on a new line" - ), - array( - 'param', - "\nint \$bob Type on a new line", - 'int', - array('int'), - '$bob', - "Type on a new line" - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php deleted file mode 100644 index 9e2aec0d..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\ReturnTag - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ReturnTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag can - * understand the @return DocBlock. - * - * @param string $type - * @param string $content - * @param string $extractedType - * @param string $extractedTypes - * @param string $extractedDescription - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag - * @dataProvider provideDataForConstructor - * - * @return void - */ - public function testConstructorParsesInputsIntoCorrectFields( - $type, - $content, - $extractedType, - $extractedTypes, - $extractedDescription - ) { - $tag = new ReturnTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($extractedType, $tag->getType()); - $this->assertEquals($extractedTypes, $tag->getTypes()); - $this->assertEquals($extractedDescription, $tag->getDescription()); - } - - /** - * Data provider for testConstructorParsesInputsIntoCorrectFields() - * - * @return array - */ - public function provideDataForConstructor() - { - return array( - array('return', '', '', array(), ''), - array('return', 'int', 'int', array('int'), ''), - array( - 'return', - 'int Number of Bobs', - 'int', - array('int'), - 'Number of Bobs' - ), - array( - 'return', - 'int|double Number of Bobs', - 'int|double', - array('int', 'double'), - 'Number of Bobs' - ), - array( - 'return', - "int Number of \n Bobs", - 'int', - array('int'), - "Number of \n Bobs" - ), - array( - 'return', - " int Number of Bobs", - 'int', - array('int'), - "Number of Bobs" - ), - array( - 'return', - "int\nNumber of Bobs", - 'int', - array('int'), - "Number of Bobs" - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php deleted file mode 100644 index 6829b046..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SeeTag - * - * @author Daniel O'Connor - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class SeeTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the phpDocumentor_Reflection_DocBlock_Tag_See can create a link - * for the @see doc block. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exReference - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\SeeTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exReference - ) { - $tag = new SeeTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exReference, $tag->getReference()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exReference - return array( - array( - 'see', - 'Foo::bar()', - 'Foo::bar()', - '', - 'Foo::bar()' - ), - array( - 'see', - 'Foo::bar() Testing', - 'Foo::bar() Testing', - 'Testing', - 'Foo::bar()', - ), - array( - 'see', - 'Foo::bar() Testing comments', - 'Foo::bar() Testing comments', - 'Testing comments', - 'Foo::bar()', - ), - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php deleted file mode 100644 index 8caf25d1..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SinceTag - * - * @author Vasil Rangelov - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class SinceTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create - * a link for the @since doc block. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exDescription - * @param string $exVersion - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\SinceTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exVersion - ) { - $tag = new SinceTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exVersion, $tag->getVersion()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exVersion - return array( - array( - 'since', - '1.0 First release.', - '1.0 First release.', - 'First release.', - '1.0' - ), - array( - 'since', - "1.0\nFirst release.", - "1.0\nFirst release.", - 'First release.', - '1.0' - ), - array( - 'since', - "1.0\nFirst\nrelease.", - "1.0\nFirst\nrelease.", - "First\nrelease.", - '1.0' - ), - array( - 'since', - 'Unfinished release', - 'Unfinished release', - 'Unfinished release', - '' - ), - array( - 'since', - '1.0', - '1.0', - '', - '1.0' - ), - array( - 'since', - 'GIT: $Id$', - 'GIT: $Id$', - '', - 'GIT: $Id$' - ), - array( - 'since', - 'GIT: $Id$ Dev build', - 'GIT: $Id$ Dev build', - 'Dev build', - 'GIT: $Id$' - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php deleted file mode 100644 index 2a40e0aa..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SourceTag - * - * @author Vasil Rangelov - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class SourceTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can - * understand the @source DocBlock. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exStartingLine - * @param string $exLineCount - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\SourceTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exStartingLine, - $exLineCount - ) { - $tag = new SourceTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exStartingLine, $tag->getStartingLine()); - $this->assertEquals($exLineCount, $tag->getLineCount()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exStartingLine, $exLineCount - return array( - array( - 'source', - '2', - '2', - '', - 2, - null - ), - array( - 'source', - 'Testing', - 'Testing', - 'Testing', - 1, - null - ), - array( - 'source', - '2 Testing', - '2 Testing', - 'Testing', - 2, - null - ), - array( - 'source', - '2 3 Testing comments', - '2 3 Testing comments', - 'Testing comments', - 2, - 3 - ), - array( - 'source', - '2 -1 Testing comments', - '2 -1 Testing comments', - '-1 Testing comments', - 2, - null - ), - array( - 'source', - '-1 1 Testing comments', - '-1 1 Testing comments', - '-1 1 Testing comments', - 1, - null - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php deleted file mode 100644 index 3c669d55..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php +++ /dev/null @@ -1,102 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\ThrowsTag - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class ThrowsTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag can - * understand the @throws DocBlock. - * - * @param string $type - * @param string $content - * @param string $extractedType - * @param string $extractedTypes - * @param string $extractedDescription - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag - * @dataProvider provideDataForConstructor - * - * @return void - */ - public function testConstructorParsesInputsIntoCorrectFields( - $type, - $content, - $extractedType, - $extractedTypes, - $extractedDescription - ) { - $tag = new ThrowsTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($extractedType, $tag->getType()); - $this->assertEquals($extractedTypes, $tag->getTypes()); - $this->assertEquals($extractedDescription, $tag->getDescription()); - } - - /** - * Data provider for testConstructorParsesInputsIntoCorrectFields() - * - * @return array - */ - public function provideDataForConstructor() - { - return array( - array('throws', '', '', array(), ''), - array('throws', 'int', 'int', array('int'), ''), - array( - 'throws', - 'int Number of Bobs', - 'int', - array('int'), - 'Number of Bobs' - ), - array( - 'throws', - 'int|double Number of Bobs', - 'int|double', - array('int', 'double'), - 'Number of Bobs' - ), - array( - 'throws', - "int Number of \n Bobs", - 'int', - array('int'), - "Number of \n Bobs" - ), - array( - 'throws', - " int Number of Bobs", - 'int', - array('int'), - "Number of Bobs" - ), - array( - 'throws', - "int\nNumber of Bobs", - 'int', - array('int'), - "Number of Bobs" - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php deleted file mode 100644 index 45868d73..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php +++ /dev/null @@ -1,86 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\UsesTag - * - * @author Daniel O'Connor - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class UsesTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\UsesTag can create - * a link for the @uses doc block. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exReference - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\UsesTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exReference - ) { - $tag = new UsesTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exReference, $tag->getReference()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exReference - return array( - array( - 'uses', - 'Foo::bar()', - 'Foo::bar()', - '', - 'Foo::bar()' - ), - array( - 'uses', - 'Foo::bar() Testing', - 'Foo::bar() Testing', - 'Testing', - 'Foo::bar()', - ), - array( - 'uses', - 'Foo::bar() Testing comments', - 'Foo::bar() Testing comments', - 'Testing comments', - 'Foo::bar()', - ), - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php deleted file mode 100644 index 9ae2aa5f..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php +++ /dev/null @@ -1,94 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag - * - * @author Daniel O'Connor - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class VarTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can - * understand the @var doc block. - * - * @param string $type - * @param string $content - * @param string $exType - * @param string $exVariable - * @param string $exDescription - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\VarTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exType, - $exVariable, - $exDescription - ) { - $tag = new VarTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exType, $tag->getType()); - $this->assertEquals($exVariable, $tag->getVariableName()); - $this->assertEquals($exDescription, $tag->getDescription()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exType, $exVariable, $exDescription - return array( - array( - 'var', - 'int', - 'int', - '', - '' - ), - array( - 'var', - 'int $bob', - 'int', - '$bob', - '' - ), - array( - 'var', - 'int $bob Number of bobs', - 'int', - '$bob', - 'Number of bobs' - ), - array( - 'var', - '', - '', - '', - '' - ), - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php deleted file mode 100644 index e145386d..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php +++ /dev/null @@ -1,115 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Tag; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VersionTag - * - * @author Vasil Rangelov - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class VersionTagTest extends \PHPUnit_Framework_TestCase -{ - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create - * a link for the @version doc block. - * - * @param string $type - * @param string $content - * @param string $exContent - * @param string $exDescription - * @param string $exVersion - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag\VersionTag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exContent, - $exDescription, - $exVersion - ) { - $tag = new VersionTag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($exContent, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - $this->assertEquals($exVersion, $tag->getVersion()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exContent, $exDescription, $exVersion - return array( - array( - 'version', - '1.0 First release.', - '1.0 First release.', - 'First release.', - '1.0' - ), - array( - 'version', - "1.0\nFirst release.", - "1.0\nFirst release.", - 'First release.', - '1.0' - ), - array( - 'version', - "1.0\nFirst\nrelease.", - "1.0\nFirst\nrelease.", - "First\nrelease.", - '1.0' - ), - array( - 'version', - 'Unfinished release', - 'Unfinished release', - 'Unfinished release', - '' - ), - array( - 'version', - '1.0', - '1.0', - '', - '1.0' - ), - array( - 'version', - 'GIT: $Id$', - 'GIT: $Id$', - '', - 'GIT: $Id$' - ), - array( - 'version', - 'GIT: $Id$ Dev build', - 'GIT: $Id$ Dev build', - 'Dev build', - 'GIT: $Id$' - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php deleted file mode 100644 index 9e873ecb..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php +++ /dev/null @@ -1,313 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock; - -use phpDocumentor\Reflection\DocBlock; -use phpDocumentor\Reflection\DocBlock\Context; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag - * - * @author Daniel O'Connor - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class TagTest extends \PHPUnit_Framework_TestCase -{ - - /** - * @expectedException \InvalidArgumentException - * - * @return void - */ - public function testInvalidTagLine() - { - Tag::createInstance('Invalid tag line'); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * - * @return void - */ - public function testTagHandlerUnregistration() - { - $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; - $tagPreUnreg = Tag::createInstance('@var mixed'); - $this->assertInstanceOf( - $currentHandler, - $tagPreUnreg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPreUnreg - ); - - Tag::registerTagHandler('var', null); - - $tagPostUnreg = Tag::createInstance('@var mixed'); - $this->assertNotInstanceOf( - $currentHandler, - $tagPostUnreg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPostUnreg - ); - - Tag::registerTagHandler('var', $currentHandler); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * - * @return void - */ - public function testTagHandlerCorrectRegistration() - { - if (0 == ini_get('allow_url_include')) { - $this->markTestSkipped('"data" URIs for includes are required.'); - } - $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; - $tagPreReg = Tag::createInstance('@var mixed'); - $this->assertInstanceOf( - $currentHandler, - $tagPreReg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPreReg - ); - - include 'data:text/plain;base64,'. base64_encode( -<<assertTrue(Tag::registerTagHandler('var', '\MyTagHandler')); - - $tagPostReg = Tag::createInstance('@var mixed'); - $this->assertNotInstanceOf( - $currentHandler, - $tagPostReg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPostReg - ); - $this->assertInstanceOf( - '\MyTagHandler', - $tagPostReg - ); - - $this->assertTrue(Tag::registerTagHandler('var', $currentHandler)); - } - - /** - * @depends testTagHandlerCorrectRegistration - * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance - * - * @return void - */ - public function testNamespacedTagHandlerCorrectRegistration() - { - $tagPreReg = Tag::createInstance('@T something'); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPreReg - ); - $this->assertNotInstanceOf( - '\MyTagHandler', - $tagPreReg - ); - - $this->assertTrue( - Tag::registerTagHandler('\MyNamespace\MyTag', '\MyTagHandler') - ); - - $tagPostReg = Tag::createInstance( - '@T something', - new DocBlock( - '', - new Context('', array('T' => '\MyNamespace\MyTag')) - ) - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPostReg - ); - $this->assertInstanceOf( - '\MyTagHandler', - $tagPostReg - ); - - $this->assertTrue( - Tag::registerTagHandler('\MyNamespace\MyTag', null) - ); - } - - /** - * @depends testTagHandlerCorrectRegistration - * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance - * - * @return void - */ - public function testNamespacedTagHandlerIncorrectRegistration() - { - $tagPreReg = Tag::createInstance('@T something'); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPreReg - ); - $this->assertNotInstanceOf( - '\MyTagHandler', - $tagPreReg - ); - - $this->assertFalse( - Tag::registerTagHandler('MyNamespace\MyTag', '\MyTagHandler') - ); - - $tagPostReg = Tag::createInstance( - '@T something', - new DocBlock( - '', - new Context('', array('T' => '\MyNamespace\MyTag')) - ) - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPostReg - ); - $this->assertNotInstanceOf( - '\MyTagHandler', - $tagPostReg - ); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * - * @return void - */ - public function testNonExistentTagHandlerRegistration() - { - $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; - $tagPreReg = Tag::createInstance('@var mixed'); - $this->assertInstanceOf( - $currentHandler, - $tagPreReg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPreReg - ); - - $this->assertFalse(Tag::registerTagHandler('var', 'Non existent')); - - $tagPostReg = Tag::createInstance('@var mixed'); - $this->assertInstanceOf( - $currentHandler, - $tagPostReg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPostReg - ); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler - * - * @return void - */ - public function testIncompatibleTagHandlerRegistration() - { - $currentHandler = __NAMESPACE__ . '\Tag\VarTag'; - $tagPreReg = Tag::createInstance('@var mixed'); - $this->assertInstanceOf( - $currentHandler, - $tagPreReg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPreReg - ); - - $this->assertFalse( - Tag::registerTagHandler('var', __NAMESPACE__ . '\TagTest') - ); - - $tagPostReg = Tag::createInstance('@var mixed'); - $this->assertInstanceOf( - $currentHandler, - $tagPostReg - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\Tag', - $tagPostReg - ); - } - - /** - * Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can - * understand the @var doc block. - * - * @param string $type - * @param string $content - * @param string $exDescription - * - * @covers \phpDocumentor\Reflection\DocBlock\Tag - * @dataProvider provideDataForConstuctor - * - * @return void - */ - public function testConstructorParesInputsIntoCorrectFields( - $type, - $content, - $exDescription - ) { - $tag = new Tag($type, $content); - - $this->assertEquals($type, $tag->getName()); - $this->assertEquals($content, $tag->getContent()); - $this->assertEquals($exDescription, $tag->getDescription()); - } - - /** - * Data provider for testConstructorParesInputsIntoCorrectFields - * - * @return array - */ - public function provideDataForConstuctor() - { - // $type, $content, $exDescription - return array( - array( - 'unknown', - 'some content', - 'some content', - ), - array( - 'unknown', - '', - '', - ) - ); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php deleted file mode 100644 index 78c7306d..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php +++ /dev/null @@ -1,195 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection\DocBlock\Type; - -use phpDocumentor\Reflection\DocBlock\Context; - -/** - * Test class for \phpDocumentor\Reflection\DocBlock\Type\Collection - * - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class CollectionTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::getContext - * - * @return void - */ - public function testConstruct() - { - $collection = new Collection(); - $this->assertCount(0, $collection); - $this->assertEquals('', $collection->getContext()->getNamespace()); - $this->assertCount(0, $collection->getContext()->getNamespaceAliases()); - } - - /** - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct - * - * @return void - */ - public function testConstructWithTypes() - { - $collection = new Collection(array('integer', 'string')); - $this->assertCount(2, $collection); - } - - /** - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct - * - * @return void - */ - public function testConstructWithNamespace() - { - $collection = new Collection(array(), new Context('\My\Space')); - $this->assertEquals('My\Space', $collection->getContext()->getNamespace()); - - $collection = new Collection(array(), new Context('My\Space')); - $this->assertEquals('My\Space', $collection->getContext()->getNamespace()); - - $collection = new Collection(array(), null); - $this->assertEquals('', $collection->getContext()->getNamespace()); - } - - /** - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct - * - * @return void - */ - public function testConstructWithNamespaceAliases() - { - $fixture = array('a' => 'b'); - $collection = new Collection(array(), new Context(null, $fixture)); - $this->assertEquals( - array('a' => '\b'), - $collection->getContext()->getNamespaceAliases() - ); - } - - /** - * @param string $fixture - * @param array $expected - * - * @dataProvider provideTypesToExpand - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add - * - * @return void - */ - public function testAdd($fixture, $expected) - { - $collection = new Collection( - array(), - new Context('\My\Space', array('Alias' => '\My\Space\Aliasing')) - ); - $collection->add($fixture); - - $this->assertSame($expected, $collection->getArrayCopy()); - } - - /** - * @param string $fixture - * @param array $expected - * - * @dataProvider provideTypesToExpandWithoutNamespace - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add - * - * @return void - */ - public function testAddWithoutNamespace($fixture, $expected) - { - $collection = new Collection( - array(), - new Context(null, array('Alias' => '\My\Space\Aliasing')) - ); - $collection->add($fixture); - - $this->assertSame($expected, $collection->getArrayCopy()); - } - - /** - * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add - * @expectedException InvalidArgumentException - * - * @return void - */ - public function testAddWithInvalidArgument() - { - $collection = new Collection(); - $collection->add(array()); - } - - /** - * Returns the types and their expected values to test the retrieval of - * types. - * - * @param string $method Name of the method consuming this data provider. - * @param string $namespace Name of the namespace to user as basis. - * - * @return string[] - */ - public function provideTypesToExpand($method, $namespace = '\My\Space\\') - { - return array( - array('', array()), - array(' ', array()), - array('int', array('int')), - array('int ', array('int')), - array('string', array('string')), - array('DocBlock', array($namespace.'DocBlock')), - array('DocBlock[]', array($namespace.'DocBlock[]')), - array(' DocBlock ', array($namespace.'DocBlock')), - array('\My\Space\DocBlock', array('\My\Space\DocBlock')), - array('Alias\DocBlock', array('\My\Space\Aliasing\DocBlock')), - array( - 'DocBlock|Tag', - array($namespace .'DocBlock', $namespace .'Tag') - ), - array( - 'DocBlock|null', - array($namespace.'DocBlock', 'null') - ), - array( - '\My\Space\DocBlock|Tag', - array('\My\Space\DocBlock', $namespace.'Tag') - ), - array( - 'DocBlock[]|null', - array($namespace.'DocBlock[]', 'null') - ), - array( - 'DocBlock[]|int[]', - array($namespace.'DocBlock[]', 'int[]') - ), - ); - } - - /** - * Returns the types and their expected values to test the retrieval of - * types when no namespace is available. - * - * @param string $method Name of the method consuming this data provider. - * - * @return string[] - */ - public function provideTypesToExpandWithoutNamespace($method) - { - return $this->provideTypesToExpand($method, '\\'); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php deleted file mode 100644 index 30eedfc5..00000000 --- a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php +++ /dev/null @@ -1,337 +0,0 @@ - - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ - -namespace phpDocumentor\Reflection; - -use phpDocumentor\Reflection\DocBlock\Context; -use phpDocumentor\Reflection\DocBlock\Location; -use phpDocumentor\Reflection\DocBlock\Tag\ReturnTag; - -/** - * Test class for phpDocumentor\Reflection\DocBlock - * - * @author Mike van Riel - * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com) - * @license http://www.opensource.org/licenses/mit-license.php MIT - * @link http://phpdoc.org - */ -class DocBlockTest extends \PHPUnit_Framework_TestCase -{ - /** - * @covers \phpDocumentor\Reflection\DocBlock - * - * @return void - */ - public function testConstruct() - { - $fixture = << '\phpDocumentor')), - new Location(2) - ); - $this->assertEquals( - 'This is a short description', - $object->getShortDescription() - ); - $this->assertEquals( - 'This is a long description', - $object->getLongDescription()->getContents() - ); - $this->assertCount(2, $object->getTags()); - $this->assertTrue($object->hasTag('see')); - $this->assertTrue($object->hasTag('return')); - $this->assertFalse($object->hasTag('category')); - - $this->assertSame('MyNamespace', $object->getContext()->getNamespace()); - $this->assertSame( - array('PHPDoc' => '\phpDocumentor'), - $object->getContext()->getNamespaceAliases() - ); - $this->assertSame(2, $object->getLocation()->getLineNumber()); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::splitDocBlock - * - * @return void - */ - public function testConstructWithTagsOnly() - { - $fixture = <<assertEquals('', $object->getShortDescription()); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(2, $object->getTags()); - $this->assertTrue($object->hasTag('see')); - $this->assertTrue($object->hasTag('return')); - $this->assertFalse($object->hasTag('category')); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::isTemplateStart - */ - public function testIfStartOfTemplateIsDiscovered() - { - $fixture = <<assertEquals('', $object->getShortDescription()); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(2, $object->getTags()); - $this->assertTrue($object->hasTag('see')); - $this->assertTrue($object->hasTag('return')); - $this->assertFalse($object->hasTag('category')); - $this->assertTrue($object->isTemplateStart()); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::isTemplateEnd - */ - public function testIfEndOfTemplateIsDiscovered() - { - $fixture = <<assertEquals('', $object->getShortDescription()); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertTrue($object->isTemplateEnd()); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::cleanInput - * - * @return void - */ - public function testConstructOneLiner() - { - $fixture = '/** Short description and nothing more. */'; - $object = new DocBlock($fixture); - $this->assertEquals( - 'Short description and nothing more.', - $object->getShortDescription() - ); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(0, $object->getTags()); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::__construct - * - * @return void - */ - public function testConstructFromReflector() - { - $object = new DocBlock(new \ReflectionClass($this)); - $this->assertEquals( - 'Test class for phpDocumentor\Reflection\DocBlock', - $object->getShortDescription() - ); - $this->assertEquals('', $object->getLongDescription()->getContents()); - $this->assertCount(4, $object->getTags()); - $this->assertTrue($object->hasTag('author')); - $this->assertTrue($object->hasTag('copyright')); - $this->assertTrue($object->hasTag('license')); - $this->assertTrue($object->hasTag('link')); - $this->assertFalse($object->hasTag('category')); - } - - /** - * @expectedException \InvalidArgumentException - * - * @return void - */ - public function testExceptionOnInvalidObject() - { - new DocBlock($this); - } - - public function testDotSeperation() - { - $fixture = <<assertEquals( - 'This is a short description.', - $object->getShortDescription() - ); - $this->assertEquals( - "This is a long description.\nThis is a continuation of the long " - ."description.", - $object->getLongDescription()->getContents() - ); - } - - /** - * @covers \phpDocumentor\Reflection\DocBlock::parseTags - * @expectedException \LogicException - * - * @return void - */ - public function testInvalidTagBlock() - { - if (0 == ini_get('allow_url_include')) { - $this->markTestSkipped('"data" URIs for includes are required.'); - } - - include 'data:text/plain;base64,'. base64_encode( - <<assertEquals( - 'This is a short description.', - $object->getShortDescription() - ); - $this->assertEquals( - 'This is a long description.', - $object->getLongDescription()->getContents() - ); - $tags = $object->getTags(); - $this->assertCount(2, $tags); - $this->assertTrue($object->hasTag('method')); - $this->assertTrue($object->hasTag('Method')); - $this->assertInstanceOf( - __NAMESPACE__ . '\DocBlock\Tag\MethodTag', - $tags[0] - ); - $this->assertInstanceOf( - __NAMESPACE__ . '\DocBlock\Tag', - $tags[1] - ); - $this->assertNotInstanceOf( - __NAMESPACE__ . '\DocBlock\Tag\MethodTag', - $tags[1] - ); - } - - /** - * @depends testConstructFromReflector - * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName - * - * @return void - */ - public function testGetTagsByNameZeroAndOneMatch() - { - $object = new DocBlock(new \ReflectionClass($this)); - $this->assertEmpty($object->getTagsByName('category')); - $this->assertCount(1, $object->getTagsByName('author')); - } - - /** - * @depends testConstructWithTagsOnly - * @covers \phpDocumentor\Reflection\DocBlock::parseTags - * - * @return void - */ - public function testParseMultilineTag() - { - $fixture = <<assertCount(1, $object->getTags()); - } - - /** - * @depends testConstructWithTagsOnly - * @covers \phpDocumentor\Reflection\DocBlock::parseTags - * - * @return void - */ - public function testParseMultilineTagWithLineBreaks() - { - $fixture = <<assertCount(1, $tags = $object->getTags()); - /** @var ReturnTag $tag */ - $tag = reset($tags); - $this->assertEquals("Content on\n multiple lines.\n\n One more, after the break.", $tag->getDescription()); - } - - /** - * @depends testConstructWithTagsOnly - * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName - * - * @return void - */ - public function testGetTagsByNameMultipleMatch() - { - $fixture = <<assertEmpty($object->getTagsByName('category')); - $this->assertCount(1, $object->getTagsByName('return')); - $this->assertCount(2, $object->getTagsByName('param')); - } -} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php new file mode 100644 index 00000000..d3043f9a --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php @@ -0,0 +1,174 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Tags\Link; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @covers :: + */ +class DescriptionFactoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\Description + * @dataProvider provideSimpleExampleDescriptions + */ + public function testDescriptionCanParseASimpleString($contents) + { + $tagFactory = m::mock(TagFactory::class); + $tagFactory->shouldReceive('create')->never(); + + $factory = new DescriptionFactory($tagFactory); + $description = $factory->create($contents, new Context('')); + + $this->assertSame($contents, $description->render()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\Description + * @dataProvider provideEscapeSequences + */ + public function testEscapeSequences($contents, $expected) + { + $tagFactory = m::mock(TagFactory::class); + $tagFactory->shouldReceive('create')->never(); + + $factory = new DescriptionFactory($tagFactory); + $description = $factory->create($contents, new Context('')); + + $this->assertSame($expected, $description->render()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\Description + * @uses phpDocumentor\Reflection\DocBlock\Tags\Link + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testDescriptionCanParseAStringWithInlineTag() + { + $contents = 'This is text for a {@link http://phpdoc.org/ description} that uses an inline tag.'; + $context = new Context(''); + $tagFactory = m::mock(TagFactory::class); + $tagFactory->shouldReceive('create') + ->once() + ->with('@link http://phpdoc.org/ description', $context) + ->andReturn(new Link('http://phpdoc.org/', new Description('description'))) + ; + + $factory = new DescriptionFactory($tagFactory); + $description = $factory->create($contents, $context); + + $this->assertSame($contents, $description->render()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\Description + * @uses phpDocumentor\Reflection\DocBlock\Tags\Link + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testDescriptionCanParseAStringStartingWithInlineTag() + { + $contents = '{@link http://phpdoc.org/ This} is text for a description that starts with an inline tag.'; + $context = new Context(''); + $tagFactory = m::mock(TagFactory::class); + $tagFactory->shouldReceive('create') + ->once() + ->with('@link http://phpdoc.org/ This', $context) + ->andReturn(new Link('http://phpdoc.org/', new Description('This'))) + ; + + $factory = new DescriptionFactory($tagFactory); + $description = $factory->create($contents, $context); + + $this->assertSame($contents, $description->render()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testIfSuperfluousStartingSpacesAreRemoved() + { + $factory = new DescriptionFactory(m::mock(TagFactory::class)); + $descriptionText = <<create($descriptionText, new Context('')); + + $this->assertSame($expectedDescription, $description->render()); + } + + /** + * Provides a series of example strings that the parser should correctly interpret and return. + * + * @return string[][] + */ + public function provideSimpleExampleDescriptions() + { + return [ + ['This is text for a description.'], + ['This is text for a description containing { that is literal.'], + ['This is text for a description containing } that is literal.'], + ['This is text for a description with {just a text} that is not a tag.'], + ]; + } + + public function provideEscapeSequences() + { + return [ + ['This is text for a description with a {@}.', 'This is text for a description with a @.'], + ['This is text for a description with a {}.', 'This is text for a description with a }.'], + ]; + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php new file mode 100644 index 00000000..b5917a9e --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php @@ -0,0 +1,75 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; +use phpDocumentor\Reflection\DocBlock\Tags\Generic; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Description + */ +class DescriptionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::__construct + * @covers ::render + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic + * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + */ + public function testDescriptionCanRenderUsingABodyWithPlaceholdersAndTags() + { + $body = 'This is a %1$s body.'; + $expected = 'This is a {@internal significant } body.'; + $tags = [new Generic('internal', new Description('significant '))]; + + $fixture = new Description($body, $tags); + + // without formatter (thus the PassthroughFormatter by default) + $this->assertSame($expected, $fixture->render()); + + // with a custom formatter + $formatter = m::mock(PassthroughFormatter::class); + $formatter->shouldReceive('format')->with($tags[0])->andReturn('@internal significant '); + $this->assertSame($expected, $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::render + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic + * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + */ + public function testDescriptionCanBeCastToString() + { + $body = 'This is a %1$s body.'; + $expected = 'This is a {@internal significant } body.'; + $tags = [new Generic('internal', new Description('significant '))]; + + $fixture = new Description($body, $tags); + + $this->assertSame($expected, (string)$fixture); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testBodyTemplateMustBeAString() + { + new Description([]); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php new file mode 100644 index 00000000..cb2b400f --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php @@ -0,0 +1,201 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Serializer + * @covers :: + */ +class SerializerTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::__construct + * @covers ::getDocComment + * @uses phpDocumentor\Reflection\DocBlock\Description + * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses phpDocumentor\Reflection\DocBlock + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic + */ + public function testReconstructsADocCommentFromADocBlock() + { + $expected = <<<'DOCCOMMENT' +/** + * This is a summary + * + * This is a description + * + * @unknown-tag Test description for the unknown tag + */ +DOCCOMMENT; + + $fixture = new Serializer(); + + $docBlock = new DocBlock( + 'This is a summary', + new Description('This is a description'), + [ + new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag')) + ] + ); + + $this->assertSame($expected, $fixture->getDocComment($docBlock)); + } + + /** + * @covers ::__construct + * @covers ::getDocComment + * @uses phpDocumentor\Reflection\DocBlock\Description + * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses phpDocumentor\Reflection\DocBlock + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic + */ + public function testAddPrefixToDocBlock() + { + $expected = <<<'DOCCOMMENT' +aa/** +aa * This is a summary +aa * +aa * This is a description +aa * +aa * @unknown-tag Test description for the unknown tag +aa */ +DOCCOMMENT; + + $fixture = new Serializer(2, 'a'); + + $docBlock = new DocBlock( + 'This is a summary', + new Description('This is a description'), + [ + new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag')) + ] + ); + + $this->assertSame($expected, $fixture->getDocComment($docBlock)); + } + + /** + * @covers ::__construct + * @covers ::getDocComment + * @uses phpDocumentor\Reflection\DocBlock\Description + * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses phpDocumentor\Reflection\DocBlock + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic + */ + public function testAddPrefixToDocBlockExceptFirstLine() + { + $expected = <<<'DOCCOMMENT' +/** +aa * This is a summary +aa * +aa * This is a description +aa * +aa * @unknown-tag Test description for the unknown tag +aa */ +DOCCOMMENT; + + $fixture = new Serializer(2, 'a', false); + + $docBlock = new DocBlock( + 'This is a summary', + new Description('This is a description'), + [ + new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag')) + ] + ); + + $this->assertSame($expected, $fixture->getDocComment($docBlock)); + } + + /** + * @covers ::__construct + * @covers ::getDocComment + * @uses phpDocumentor\Reflection\DocBlock\Description + * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses phpDocumentor\Reflection\DocBlock + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic + */ + public function testWordwrapsAroundTheGivenAmountOfCharacters() + { + $expected = <<<'DOCCOMMENT' +/** + * This is a + * summary + * + * This is a + * description + * + * @unknown-tag + * Test + * description + * for the + * unknown tag + */ +DOCCOMMENT; + + $fixture = new Serializer(0, '', true, 15); + + $docBlock = new DocBlock( + 'This is a summary', + new Description('This is a description'), + [ + new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag')) + ] + ); + + $this->assertSame($expected, $fixture->getDocComment($docBlock)); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testInitializationFailsIfIndentIsNotAnInteger() + { + new Serializer([]); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testInitializationFailsIfIndentStringIsNotAString() + { + new Serializer(0, []); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testInitializationFailsIfIndentFirstLineIsNotABoolean() + { + new Serializer(0, '', []); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testInitializationFailsIfLineLengthIsNotNullNorAnInteger() + { + new Serializer(0, '', false, []); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php new file mode 100644 index 00000000..0247da04 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php @@ -0,0 +1,361 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Tags\Author; +use phpDocumentor\Reflection\DocBlock\Tags\Formatter; +use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter; +use phpDocumentor\Reflection\DocBlock\Tags\Generic; +use phpDocumentor\Reflection\DocBlock\Tags\Return_; +use phpDocumentor\Reflection\DocBlock\Tags\See; +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass phpDocumentor\Reflection\DocBlock\StandardTagFactory + * @covers :: + */ +class StandardTagFactoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testCreatingAGenericTag() + { + $expectedTagName = 'unknown-tag'; + $expectedDescriptionText = 'This is a description'; + $expectedDescription = new Description($expectedDescriptionText); + $context = new Context(''); + + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory + ->shouldReceive('create') + ->once() + ->with($expectedDescriptionText, $context) + ->andReturn($expectedDescription) + ; + + $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class)); + $tagFactory->addService($descriptionFactory, DescriptionFactory::class); + + /** @var Generic $tag */ + $tag = $tagFactory->create('@' . $expectedTagName . ' This is a description', $context); + + $this->assertInstanceOf(Generic::class, $tag); + $this->assertSame($expectedTagName, $tag->getName()); + $this->assertSame($expectedDescription, $tag->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @uses phpDocumentor\Reflection\DocBlock\Tags\Author + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + */ + public function testCreatingASpecificTag() + { + $context = new Context(''); + $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class)); + + /** @var Author $tag */ + $tag = $tagFactory->create('@author Mike van Riel ', $context); + + $this->assertInstanceOf(Author::class, $tag); + $this->assertSame('author', $tag->getName()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @uses phpDocumentor\Reflection\DocBlock\Tags\See + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + */ + public function testAnEmptyContextIsCreatedIfNoneIsProvided() + { + $fqsen = '\Tag'; + $resolver = m::mock(FqsenResolver::class) + ->shouldReceive('resolve') + ->with('Tag', m::type(Context::class)) + ->andReturn(new Fqsen($fqsen)) + ->getMock() + ; + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory->shouldIgnoreMissing(); + + $tagFactory = new StandardTagFactory($resolver); + $tagFactory->addService($descriptionFactory, DescriptionFactory::class); + + /** @var See $tag */ + $tag = $tagFactory->create('@see Tag'); + + $this->assertInstanceOf(See::class, $tag); + $this->assertSame($fqsen, (string)$tag->getReference()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @uses phpDocumentor\Reflection\DocBlock\Tags\Author + * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag + */ + public function testPassingYourOwnSetOfTagHandlers() + { + $context = new Context(''); + $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class), ['user' => Author::class]); + + /** @var Author $tag */ + $tag = $tagFactory->create('@user Mike van Riel ', $context); + + $this->assertInstanceOf(Author::class, $tag); + $this->assertSame('author', $tag->getName()); + } + + /** + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The tag "@user/myuser" does not seem to be wellformed, please check it for errors + */ + public function testExceptionIsThrownIfProvidedTagIsNotWellformed() + { + $this->markTestIncomplete( + 'For some reason this test fails; once I have access to a RegEx analyzer I will have to test the regex' + ) + ; + $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class)); + $tagFactory->create('@user[myuser'); + } + + /** + * @covers ::__construct + * @covers ::addParameter + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + */ + public function testAddParameterToServiceLocator() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + $tagFactory->addParameter('myParam', 'myValue'); + + $this->assertAttributeSame( + [FqsenResolver::class => $resolver, 'myParam' => 'myValue'], + 'serviceLocator', + $tagFactory + ) + ; + } + + /** + * @covers ::addService + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + */ + public function testAddServiceToServiceLocator() + { + $service = new PassthroughFormatter(); + + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + $tagFactory->addService($service); + + $this->assertAttributeSame( + [FqsenResolver::class => $resolver, PassthroughFormatter::class => $service], + 'serviceLocator', + $tagFactory + ) + ; + } + + /** + * @covers ::addService + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + */ + public function testInjectConcreteServiceForInterfaceToServiceLocator() + { + $interfaceName = Formatter::class; + $service = new PassthroughFormatter(); + + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + $tagFactory->addService($service, $interfaceName); + + $this->assertAttributeSame( + [FqsenResolver::class => $resolver, $interfaceName => $service], + 'serviceLocator', + $tagFactory + ) + ; + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::create + * @uses phpDocumentor\Reflection\DocBlock\Tags\Author + */ + public function testRegisteringAHandlerForANewTag() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler('my-tag', Author::class); + + // Assert by trying to create one + $tag = $tagFactory->create('@my-tag Mike van Riel '); + $this->assertInstanceOf(Author::class, $tag); + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + */ + public function testHandlerRegistrationFailsIfProvidedTagNameIsNotAString() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler([], Author::class); + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + */ + public function testHandlerRegistrationFailsIfProvidedTagNameIsEmpty() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler('', Author::class); + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + */ + public function testHandlerRegistrationFailsIfProvidedTagNameIsNamespaceButNotFullyQualified() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler('Name\Spaced\Tag', Author::class); + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + */ + public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAString() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler('my-tag', []); + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + */ + public function testHandlerRegistrationFailsIfProvidedHandlerIsEmpty() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler('my-tag', ''); + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + */ + public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAnExistingClassName() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler('my-tag', 'IDoNotExist'); + } + + /** + * @covers ::registerTagHandler + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @expectedException \InvalidArgumentException + */ + public function testHandlerRegistrationFailsIfProvidedHandlerDoesNotImplementTheTagInterface() + { + $resolver = m::mock(FqsenResolver::class); + $tagFactory = new StandardTagFactory($resolver); + + $tagFactory->registerTagHandler('my-tag', 'stdClass'); + } + + /** + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct + * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService + * @uses phpDocumentor\Reflection\Docblock\Description + * @uses phpDocumentor\Reflection\Docblock\Tags\Return_ + * @uses phpDocumentor\Reflection\Docblock\Tags\BaseTag + */ + public function testReturntagIsMappedCorrectly() + { + $context = new Context(''); + + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory + ->shouldReceive('create') + ->once() + ->with('', $context) + ->andReturn(new Description('')) + ; + + $typeResolver = new TypeResolver(); + + $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class)); + $tagFactory->addService($descriptionFactory, DescriptionFactory::class); + $tagFactory->addService($typeResolver, TypeResolver::class); + + + /** @var Return_ $tag */ + $tag = $tagFactory->create('@return mixed', $context); + + $this->assertInstanceOf(Return_::class, $tag); + $this->assertSame('return', $tag->getName()); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php new file mode 100644 index 00000000..a54954f8 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php @@ -0,0 +1,148 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Author + * @covers :: + */ +class AuthorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Author('Mike van Riel', 'mike@phpdoc.org'); + + $this->assertSame('author', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Author('Mike van Riel', 'mike@phpdoc.org'); + + $this->assertSame('@author Mike van Riel', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Author('Mike van Riel', 'mike@phpdoc.org'); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getAuthorName + */ + public function testHasTheAuthorName() + { + $expected = 'Mike van Riel'; + + $fixture = new Author($expected, 'mike@phpdoc.org'); + + $this->assertSame($expected, $fixture->getAuthorName()); + } + + /** + * @covers ::__construct + * @covers ::getAuthorName + * @expectedException \InvalidArgumentException + */ + public function testInitializationFailsIfAuthorNameIsNotAString() + { + new Author([], 'mike@phpdoc.org'); + } + + /** + * @covers ::__construct + * @covers ::getEmail + */ + public function testHasTheAuthorMailAddress() + { + $expected = 'mike@phpdoc.org'; + + $fixture = new Author('Mike van Riel', $expected); + + $this->assertSame($expected, $fixture->getEmail()); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testInitializationFailsIfEmailIsNotAString() + { + new Author('Mike van Riel', []); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testInitializationFailsIfEmailIsNotValid() + { + new Author('Mike van Riel', 'mike'); + } + + /** + * @covers ::__construct + * @covers ::__toString + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Author('Mike van Riel', 'mike@phpdoc.org'); + + $this->assertSame('Mike van Riel', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author:: + */ + public function testFactoryMethod() + { + $fixture = Author::create('Mike van Riel '); + + $this->assertSame('Mike van Riel', (string)$fixture); + $this->assertSame('Mike van Riel', $fixture->getAuthorName()); + $this->assertSame('mike@phpdoc.org', $fixture->getEmail()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author:: + */ + public function testFactoryMethodReturnsNullIfItCouldNotReadBody() + { + $this->assertNull(Author::create('dfgr<')); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php new file mode 100644 index 00000000..a2b5e4b3 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php @@ -0,0 +1,155 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Covers + * @covers :: + */ +class CoversTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('covers', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('@covers \DateTime Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getReference + */ + public function testHasReferenceToFqsen() + { + $expected = new Fqsen('\DateTime'); + + $fixture = new Covers($expected); + + $this->assertSame($expected, $fixture->getReference()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Covers(new Fqsen('\DateTime'), $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('\DateTime Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\FqsenResolver + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Fqsen + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $resolver = m::mock(FqsenResolver::class); + $context = new Context(''); + + $fqsen = new Fqsen('\DateTime'); + $description = new Description('My Description'); + + $descriptionFactory + ->shouldReceive('create')->with('My Description', $context)->andReturn($description); + $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen); + + $fixture = Covers::create('DateTime My Description', $descriptionFactory, $resolver, $context); + + $this->assertSame('\DateTime My Description', (string)$fixture); + $this->assertSame($fqsen, $fixture->getReference()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + $this->assertNull(Covers::create([])); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotEmpty() + { + $this->assertNull(Covers::create('')); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php new file mode 100644 index 00000000..eca9664f --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php @@ -0,0 +1,166 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Deprecated + * @covers :: + */ +class DeprecatedTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Deprecated('1.0', new Description('Description')); + + $this->assertSame('deprecated', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Deprecated('1.0', new Description('Description')); + + $this->assertSame('@deprecated 1.0 Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Deprecated('1.0', new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVersion + */ + public function testHasVersionNumber() + { + $expected = '1.0'; + + $fixture = new Deprecated($expected); + + $this->assertSame($expected, $fixture->getVersion()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Deprecated('1.0', $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Deprecated('1.0', new Description('Description')); + + $this->assertSame('1.0 Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $version = '1.0'; + $description = new Description('My Description'); + + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Deprecated::create('1.0 My Description', $descriptionFactory, $context); + + $this->assertSame('1.0 My Description', (string)$fixture); + $this->assertSame($version, $fixture->getVersion()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethodCreatesEmptyDeprecatedTag() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory->shouldReceive('create')->never(); + + $fixture = Deprecated::create('', $descriptionFactory, new Context('')); + + $this->assertSame('', (string)$fixture); + $this->assertSame(null, $fixture->getVersion()); + $this->assertSame(null, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfVersionIsNotString() + { + $this->assertNull(Deprecated::create([])); + } + + /** + * @covers ::create + */ + public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex() + { + $this->assertNull(Deprecated::create('dkhf<')); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php new file mode 100644 index 00000000..045a197f --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php @@ -0,0 +1,41 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\Tags\Generic; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + */ +class PassthroughFormatterTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::format + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic + */ + public function testFormatterCallsToStringAndReturnsAStandardRepresentation() + { + $expected = '@unknown-tag This is a description'; + + $fixture = new PassthroughFormatter(); + + $this->assertSame( + $expected, + $fixture->format(new Generic('unknown-tag', new Description('This is a description'))) + ); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php new file mode 100644 index 00000000..02fa5300 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php @@ -0,0 +1,146 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @generic http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Generic + * @covers :: + */ +class GenericTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Generic('generic', new Description('Description')); + + $this->assertSame('generic', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Generic('generic', new Description('Description')); + + $this->assertSame('@generic Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Generic('generic', new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Generic('generic', $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Generic('generic', new Description('Description')); + + $this->assertSame('Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $generics = 'generic'; + $description = new Description('My Description'); + + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Generic::create('My Description', 'generic', $descriptionFactory, $context); + + $this->assertSame('My Description', (string)$fixture); + $this->assertSame($generics, $fixture->getName()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfNameIsNotString() + { + Generic::create('', []); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfNameIsNotEmpty() + { + Generic::create('', ''); + } + + /** + * @covers ::create + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfNameContainsIllegalCharacters() + { + Generic::create('', 'name/myname'); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php new file mode 100644 index 00000000..9940aec7 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php @@ -0,0 +1,158 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Link + * @covers :: + */ +class LinkTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Link('http://this.is.my/link', new Description('Description')); + + $this->assertSame('link', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Link('http://this.is.my/link', new Description('Description')); + + $this->assertSame('@link http://this.is.my/link Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Link('http://this.is.my/link', new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getLink + */ + public function testHasLinkUrl() + { + $expected = 'http://this.is.my/link'; + + $fixture = new Link($expected); + + $this->assertSame($expected, $fixture->getLink()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Link('http://this.is.my/link', $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Link('http://this.is.my/link', new Description('Description')); + + $this->assertSame('http://this.is.my/link Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $links = 'http://this.is.my/link'; + $description = new Description('My Description'); + + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Link::create('http://this.is.my/link My Description', $descriptionFactory, $context); + + $this->assertSame('http://this.is.my/link My Description', (string)$fixture); + $this->assertSame($links, $fixture->getLink()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethodCreatesEmptyLinkTag() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory->shouldReceive('create')->never(); + + $fixture = Link::create('', $descriptionFactory, new Context('')); + + $this->assertSame('', (string)$fixture); + $this->assertSame('', $fixture->getLink()); + $this->assertSame(null, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfVersionIsNotString() + { + $this->assertNull(Link::create([])); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php new file mode 100644 index 00000000..aae6472f --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php @@ -0,0 +1,410 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Array_; +use phpDocumentor\Reflection\Types\Compound; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\Integer; +use phpDocumentor\Reflection\Types\Object_; +use phpDocumentor\Reflection\Types\String_; +use phpDocumentor\Reflection\Types\Void_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Method + * @covers :: + */ +class MethodTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Method('myMethod'); + + $this->assertSame('method', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $arguments = [ + ['name' => 'argument1', 'type' => new String_()], + ['name' => 'argument2', 'type' => new Object_()] + ]; + $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description')); + + $this->assertSame( + '@method static void myMethod(string $argument1, object $argument2) My Description', + $fixture->render() + ); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Method('myMethod'); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getMethodName + */ + public function testHasMethodName() + { + $expected = 'myMethod'; + + $fixture = new Method($expected); + + $this->assertSame($expected, $fixture->getMethodName()); + } + + /** + * @covers ::__construct + * @covers ::getArguments + */ + public function testHasArguments() + { + $arguments = [ + [ 'name' => 'argument1', 'type' => new String_() ] + ]; + + $fixture = new Method('myMethod', $arguments); + + $this->assertSame($arguments, $fixture->getArguments()); + } + + /** + * @covers ::__construct + * @covers ::getArguments + */ + public function testArgumentsMayBePassedAsString() + { + $arguments = ['argument1']; + $expected = [ + [ 'name' => $arguments[0], 'type' => new Void_() ] + ]; + + $fixture = new Method('myMethod', $arguments); + + $this->assertEquals($expected, $fixture->getArguments()); + } + + /** + * @covers ::__construct + * @covers ::getArguments + */ + public function testArgumentTypeCanBeInferredAsVoid() + { + $arguments = [ [ 'name' => 'argument1' ] ]; + $expected = [ + [ 'name' => $arguments[0]['name'], 'type' => new Void_() ] + ]; + + $fixture = new Method('myMethod', $arguments); + + $this->assertEquals($expected, $fixture->getArguments()); + } + + /** + * @covers ::__construct + * @covers ::getReturnType + */ + public function testHasReturnType() + { + $expected = new String_(); + + $fixture = new Method('myMethod', [], $expected); + + $this->assertSame($expected, $fixture->getReturnType()); + } + + /** + * @covers ::__construct + * @covers ::getReturnType + */ + public function testReturnTypeCanBeInferredAsVoid() + { + $fixture = new Method('myMethod', []); + + $this->assertEquals(new Void_(), $fixture->getReturnType()); + } + + /** + * @covers ::__construct + * @covers ::isStatic + */ + public function testMethodCanBeStatic() + { + $expected = false; + $fixture = new Method('myMethod', [], null, $expected); + $this->assertSame($expected, $fixture->isStatic()); + + $expected = true; + $fixture = new Method('myMethod', [], null, $expected); + $this->assertSame($expected, $fixture->isStatic()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Method('myMethod', [], null, false, $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic + */ + public function testStringRepresentationIsReturned() + { + $arguments = [ + ['name' => 'argument1', 'type' => new String_()], + ['name' => 'argument2', 'type' => new Object_()] + ]; + $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description')); + + $this->assertSame( + 'static void myMethod(string $argument1, object $argument2) My Description', + (string)$fixture + ); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Fqsen + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $resolver = new TypeResolver(); + $context = new Context(''); + + $description = new Description('My Description'); + $expectedArguments = [ + [ 'name' => 'argument1', 'type' => new String_() ], + [ 'name' => 'argument2', 'type' => new Void_() ] + ]; + + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Method::create( + 'static void myMethod(string $argument1, $argument2) My Description', + $resolver, + $descriptionFactory, + $context + ); + + $this->assertSame('static void myMethod(string $argument1, void $argument2) My Description', (string)$fixture); + $this->assertSame('myMethod', $fixture->getMethodName()); + $this->assertEquals($expectedArguments, $fixture->getArguments()); + $this->assertInstanceOf(Void_::class, $fixture->getReturnType()); + $this->assertSame($description, $fixture->getDescription()); + } + + public function collectionReturnTypesProvider() + { + return [ + ['int[]', Array_::class, Integer::class, Compound::class], + ['int[][]', Array_::class, Array_::class, Compound::class], + ['Object[]', Array_::class, Object_::class, Compound::class], + ['array[]', Array_::class, Array_::class, Compound::class], + ]; + } + + /** + * @dataProvider collectionReturnTypesProvider + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method:: + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\Types\Array_ + * @uses \phpDocumentor\Reflection\Types\Compound + * @uses \phpDocumentor\Reflection\Types\Integer + * @uses \phpDocumentor\Reflection\Types\Object_ + * @param string $returnType + * @param string $expectedType + * @param string $expectedValueType + * @param string null $expectedKeyType + */ + public function testCollectionReturnTypes( + $returnType, + $expectedType, + $expectedValueType = null, + $expectedKeyType = null + ) { $resolver = new TypeResolver(); + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory->shouldReceive('create')->with('', null)->andReturn(new Description('')); + + $fixture = Method::create("$returnType myMethod(\$arg)", $resolver, $descriptionFactory); + $returnType = $fixture->getReturnType(); + $this->assertInstanceOf($expectedType, $returnType); + + if ($returnType instanceof Array_) { + $this->assertInstanceOf($expectedValueType, $returnType->getValueType()); + $this->assertInstanceOf($expectedKeyType, $returnType->getKeyType()); + } + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + Method::create([]); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsEmpty() + { + Method::create(''); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodReturnsNullIfBodyIsIncorrect() + { + $this->assertNull(Method::create('body(')); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + Method::create('body'); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Method::create('body', new TypeResolver()); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testCreationFailsIfBodyIsNotString() + { + new Method([]); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testCreationFailsIfBodyIsEmpty() + { + new Method(''); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testCreationFailsIfStaticIsNotBoolean() + { + new Method('body', [], null, []); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testCreationFailsIfArgumentRecordContainsInvalidEntry() + { + new Method('body', [ [ 'name' => 'myName', 'unknown' => 'nah' ] ]); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Fqsen + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testCreateMethodParenthesisMissing() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $resolver = new TypeResolver(); + $context = new Context(''); + + $description = new Description('My Description'); + + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Method::create( + 'static void myMethod My Description', + $resolver, + $descriptionFactory, + $context + ); + + $this->assertSame('static void myMethod() My Description', (string)$fixture); + $this->assertSame('myMethod', $fixture->getMethodName()); + $this->assertEquals([], $fixture->getArguments()); + $this->assertInstanceOf(Void_::class, $fixture->getReturnType()); + $this->assertSame($description, $fixture->getDescription()); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php new file mode 100644 index 00000000..0c718ab7 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php @@ -0,0 +1,228 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Param + * @covers :: + */ +class ParamTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Param('myParameter', null, false, new Description('Description')); + + $this->assertSame('param', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::isVariadic + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Param('myParameter', new String_(), true, new Description('Description')); + $this->assertSame('@param string ...$myParameter Description', $fixture->render()); + + $fixture = new Param('myParameter', new String_(), false, new Description('Description')); + $this->assertSame('@param string $myParameter Description', $fixture->render()); + + $fixture = new Param('myParameter', null, false, new Description('Description')); + $this->assertSame('@param $myParameter Description', $fixture->render()); + + $fixture = new Param('myParameter'); + $this->assertSame('@param $myParameter', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Param('myParameter'); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVariableName + */ + public function testHasVariableName() + { + $expected = 'myParameter'; + + $fixture = new Param($expected); + + $this->assertSame($expected, $fixture->getVariableName()); + } + + /** + * @covers ::__construct + * @covers ::getType + */ + public function testHasType() + { + $expected = new String_(); + + $fixture = new Param('myParameter', $expected); + + $this->assertSame($expected, $fixture->getType()); + } + + /** + * @covers ::__construct + * @covers ::isVariadic + */ + public function testIfParameterIsVariadic() + { + $fixture = new Param('myParameter', new String_(), false); + $this->assertFalse($fixture->isVariadic()); + + $fixture = new Param('myParameter', new String_(), true); + $this->assertTrue($fixture->isVariadic()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Param('1.0', null, false, $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::isVariadic + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Param('myParameter', new String_(), true, new Description('Description')); + + $this->assertSame('string ...$myParameter Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $typeResolver = new TypeResolver(); + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Param::create('string ...$myParameter My Description', $typeResolver, $descriptionFactory, $context); + + $this->assertSame('string ...$myParameter My Description', (string)$fixture); + $this->assertSame('myParameter', $fixture->getVariableName()); + $this->assertInstanceOf(String_::class, $fixture->getType()); + $this->assertTrue($fixture->isVariadic()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param:: + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfEmptyBodyIsGiven() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + Param::create('', new TypeResolver(), $descriptionFactory); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + Param::create([]); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + Param::create('body'); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\TypeResolver + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Param::create('body', new TypeResolver()); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfVariableNameIsNotString() + { + new Param([]); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfVariadicIsNotBoolean() + { + new Param('', null, []); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php new file mode 100644 index 00000000..c3fb7700 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php @@ -0,0 +1,201 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead + * @covers :: + */ +class PropertyReadTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new PropertyRead('myProperty', null, new Description('Description')); + + $this->assertSame('property-read', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new PropertyRead('myProperty', new String_(), new Description('Description')); + $this->assertSame('@property-read string $myProperty Description', $fixture->render()); + + $fixture = new PropertyRead('myProperty', null, new Description('Description')); + $this->assertSame('@property-read $myProperty Description', $fixture->render()); + + $fixture = new PropertyRead('myProperty'); + $this->assertSame('@property-read $myProperty', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new PropertyRead('myProperty'); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVariableName + */ + public function testHasVariableName() + { + $expected = 'myProperty'; + + $fixture = new PropertyRead($expected); + + $this->assertSame($expected, $fixture->getVariableName()); + } + + /** + * @covers ::__construct + * @covers ::getType + */ + public function testHasType() + { + $expected = new String_(); + + $fixture = new PropertyRead('myProperty', $expected); + + $this->assertSame($expected, $fixture->getType()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new PropertyRead('1.0', null, $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + */ + public function testStringRepresentationIsReturned() + { + $fixture = new PropertyRead('myProperty', new String_(), new Description('Description')); + + $this->assertSame('string $myProperty Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $typeResolver = new TypeResolver(); + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = PropertyRead::create('string $myProperty My Description', $typeResolver, $descriptionFactory, + $context); + + $this->assertSame('string $myProperty My Description', (string)$fixture); + $this->assertSame('myProperty', $fixture->getVariableName()); + $this->assertInstanceOf(String_::class, $fixture->getType()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead:: + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfEmptyBodyIsGiven() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + PropertyRead::create('', new TypeResolver(), $descriptionFactory); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + PropertyRead::create([]); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + PropertyRead::create('body'); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\TypeResolver + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + PropertyRead::create('body', new TypeResolver()); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfVariableNameIsNotString() + { + new PropertyRead([]); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php new file mode 100644 index 00000000..908dfb28 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php @@ -0,0 +1,200 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Property + * @covers :: + */ +class PropertyTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Property('myProperty', null, new Description('Description')); + + $this->assertSame('property', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Property('myProperty', new String_(), new Description('Description')); + $this->assertSame('@property string $myProperty Description', $fixture->render()); + + $fixture = new Property('myProperty', null, new Description('Description')); + $this->assertSame('@property $myProperty Description', $fixture->render()); + + $fixture = new Property('myProperty'); + $this->assertSame('@property $myProperty', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Property('myProperty'); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVariableName + */ + public function testHasVariableName() + { + $expected = 'myProperty'; + + $fixture = new Property($expected); + + $this->assertSame($expected, $fixture->getVariableName()); + } + + /** + * @covers ::__construct + * @covers ::getType + */ + public function testHasType() + { + $expected = new String_(); + + $fixture = new Property('myProperty', $expected); + + $this->assertSame($expected, $fixture->getType()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Property('1.0', null, $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Property('myProperty', new String_(), new Description('Description')); + + $this->assertSame('string $myProperty Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $typeResolver = new TypeResolver(); + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Property::create('string $myProperty My Description', $typeResolver, $descriptionFactory, $context); + + $this->assertSame('string $myProperty My Description', (string)$fixture); + $this->assertSame('myProperty', $fixture->getVariableName()); + $this->assertInstanceOf(String_::class, $fixture->getType()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property:: + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfEmptyBodyIsGiven() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + Property::create('', new TypeResolver(), $descriptionFactory); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + Property::create([]); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + Property::create('body'); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\TypeResolver + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Property::create('body', new TypeResolver()); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfVariableNameIsNotString() + { + new Property([]); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php new file mode 100644 index 00000000..5ea6524c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php @@ -0,0 +1,201 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite + * @covers :: + */ +class PropertyWriteTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new PropertyWrite('myProperty', null, new Description('Description')); + + $this->assertSame('property-write', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description')); + $this->assertSame('@property-write string $myProperty Description', $fixture->render()); + + $fixture = new PropertyWrite('myProperty', null, new Description('Description')); + $this->assertSame('@property-write $myProperty Description', $fixture->render()); + + $fixture = new PropertyWrite('myProperty'); + $this->assertSame('@property-write $myProperty', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new PropertyWrite('myProperty'); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVariableName + */ + public function testHasVariableName() + { + $expected = 'myProperty'; + + $fixture = new PropertyWrite($expected); + + $this->assertSame($expected, $fixture->getVariableName()); + } + + /** + * @covers ::__construct + * @covers ::getType + */ + public function testHasType() + { + $expected = new String_(); + + $fixture = new PropertyWrite('myProperty', $expected); + + $this->assertSame($expected, $fixture->getType()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new PropertyWrite('1.0', null, $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + */ + public function testStringRepresentationIsReturned() + { + $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description')); + + $this->assertSame('string $myProperty Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $typeResolver = new TypeResolver(); + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = PropertyWrite::create('string $myProperty My Description', $typeResolver, $descriptionFactory, + $context); + + $this->assertSame('string $myProperty My Description', (string)$fixture); + $this->assertSame('myProperty', $fixture->getVariableName()); + $this->assertInstanceOf(String_::class, $fixture->getType()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite:: + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfEmptyBodyIsGiven() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + PropertyWrite::create('', new TypeResolver(), $descriptionFactory); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + PropertyWrite::create([]); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + PropertyWrite::create('body'); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\TypeResolver + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + PropertyWrite::create('body', new TypeResolver()); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfVariableNameIsNotString() + { + new PropertyWrite([]); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php new file mode 100644 index 00000000..2bc54391 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php @@ -0,0 +1,170 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Return_ + * @covers :: + */ +class ReturnTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Return_(new String_(), new Description('Description')); + + $this->assertSame('return', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Return_(new String_(), new Description('Description')); + + $this->assertSame('@return string Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Return_(new String_(), new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getType + */ + public function testHasType() + { + $expected = new String_(); + + $fixture = new Return_($expected); + + $this->assertSame($expected, $fixture->getType()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Return_(new String_(), $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Return_(new String_(), new Description('Description')); + + $this->assertSame('string Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $resolver = new TypeResolver(); + $context = new Context(''); + + $type = new String_(); + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Return_::create('string My Description', $resolver, $descriptionFactory, $context); + + $this->assertSame('string My Description', (string)$fixture); + $this->assertEquals($type, $fixture->getType()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + $this->assertNull(Return_::create([])); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotEmpty() + { + $this->assertNull(Return_::create('')); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + Return_::create('body'); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Return_::create('body', new TypeResolver()); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php new file mode 100644 index 00000000..8d3e3e8c --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php @@ -0,0 +1,173 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\See + * @covers :: + */ +class SeeTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new See(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('see', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new See(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('@see \DateTime Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new See(new Fqsen('\DateTime'), new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getReference + */ + public function testHasReferenceToFqsen() + { + $expected = new Fqsen('\DateTime'); + + $fixture = new See($expected); + + $this->assertSame($expected, $fixture->getReference()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new See(new Fqsen('\DateTime'), $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new See(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('\DateTime Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\See:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\FqsenResolver + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Fqsen + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $resolver = m::mock(FqsenResolver::class); + $context = new Context(''); + + $fqsen = new Fqsen('\DateTime'); + $description = new Description('My Description'); + + $descriptionFactory + ->shouldReceive('create')->with('My Description', $context)->andReturn($description); + $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen); + + $fixture = See::create('DateTime My Description', $resolver, $descriptionFactory, $context); + + $this->assertSame('\DateTime My Description', (string)$fixture); + $this->assertSame($fqsen, $fixture->getReference()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + $this->assertNull(See::create([])); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotEmpty() + { + $this->assertNull(See::create('')); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + See::create('body'); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + See::create('body', new FqsenResolver()); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php new file mode 100644 index 00000000..3f42db5d --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php @@ -0,0 +1,166 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Since + * @covers :: + */ +class SinceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Since('1.0', new Description('Description')); + + $this->assertSame('since', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Since('1.0', new Description('Description')); + + $this->assertSame('@since 1.0 Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Since('1.0', new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVersion + */ + public function testHasVersionNumber() + { + $expected = '1.0'; + + $fixture = new Since($expected); + + $this->assertSame($expected, $fixture->getVersion()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Since('1.0', $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Since('1.0', new Description('Description')); + + $this->assertSame('1.0 Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $version = '1.0'; + $description = new Description('My Description'); + + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Since::create('1.0 My Description', $descriptionFactory, $context); + + $this->assertSame('1.0 My Description', (string)$fixture); + $this->assertSame($version, $fixture->getVersion()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethodCreatesEmptySinceTag() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory->shouldReceive('create')->never(); + + $fixture = Since::create('', $descriptionFactory, new Context('')); + + $this->assertSame('', (string)$fixture); + $this->assertSame(null, $fixture->getVersion()); + $this->assertSame(null, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfSinceIsNotString() + { + $this->assertNull(Since::create([])); + } + + /** + * @covers ::create + */ + public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex() + { + $this->assertNull(Since::create('dkhf<')); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php new file mode 100644 index 00000000..cbf01f65 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php @@ -0,0 +1,199 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Source + * @covers :: + */ +class SourceTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Source(1, null, new Description('Description')); + + $this->assertSame('source', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Source(1, 10, new Description('Description')); + $this->assertSame('@source 1 10 Description', $fixture->render()); + + $fixture = new Source(1, null, new Description('Description')); + $this->assertSame('@source 1 Description', $fixture->render()); + + $fixture = new Source(1); + $this->assertSame('@source 1', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Source(1); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getStartingLine + */ + public function testHasStartingLine() + { + $expected = 1; + + $fixture = new Source($expected); + + $this->assertSame($expected, $fixture->getStartingLine()); + } + + /** + * @covers ::__construct + * @covers ::getLineCount + */ + public function testHasLineCount() + { + $expected = 2; + + $fixture = new Source(1, $expected); + + $this->assertSame($expected, $fixture->getLineCount()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Source('1', null, $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Source(1, 10, new Description('Description')); + + $this->assertSame('1 10 Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Source::create('1 10 My Description', $descriptionFactory, $context); + + $this->assertSame('1 10 My Description', (string)$fixture); + $this->assertSame(1, $fixture->getStartingLine()); + $this->assertSame(10, $fixture->getLineCount()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source:: + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfEmptyBodyIsGiven() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + Source::create('', $descriptionFactory); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + Source::create([]); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\TypeResolver + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Source::create('1'); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfStartingLineIsNotInteger() + { + new Source('blabla'); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfLineCountIsNotIntegerOrNull() + { + new Source('1', []); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php new file mode 100644 index 00000000..657d6ca5 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php @@ -0,0 +1,170 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Throws + * @covers :: + */ +class ThrowsTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Throws(new String_(), new Description('Description')); + + $this->assertSame('throws', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Throws(new String_(), new Description('Description')); + + $this->assertSame('@throws string Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Throws(new String_(), new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getType + */ + public function testHasType() + { + $expected = new String_(); + + $fixture = new Throws($expected); + + $this->assertSame($expected, $fixture->getType()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Throws(new String_(), $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Throws(new String_(), new Description('Description')); + + $this->assertSame('string Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $resolver = new TypeResolver(); + $context = new Context(''); + + $type = new String_(); + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Throws::create('string My Description', $resolver, $descriptionFactory, $context); + + $this->assertSame('string My Description', (string)$fixture); + $this->assertEquals($type, $fixture->getType()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + $this->assertNull(Throws::create([])); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotEmpty() + { + $this->assertNull(Throws::create('')); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + Throws::create('body'); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Throws::create('body', new TypeResolver()); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php new file mode 100644 index 00000000..419f7e36 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php @@ -0,0 +1,174 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\FqsenResolver; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Uses + * @covers :: + */ +class UsesTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('uses', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('@uses \DateTime Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getReference + */ + public function testHasReferenceToFqsen() + { + $expected = new Fqsen('\DateTime'); + + $fixture = new Uses($expected); + + $this->assertSame($expected, $fixture->getReference()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Uses(new Fqsen('\DateTime'), $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description')); + + $this->assertSame('\DateTime Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\FqsenResolver + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Fqsen + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $resolver = m::mock(FqsenResolver::class); + $context = new Context(''); + + $fqsen = new Fqsen('\DateTime'); + $description = new Description('My Description'); + + $descriptionFactory + ->shouldReceive('create')->with('My Description', $context)->andReturn($description) + ; + $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen); + + $fixture = Uses::create('DateTime My Description', $resolver, $descriptionFactory, $context); + + $this->assertSame('\DateTime My Description', (string)$fixture); + $this->assertSame($fqsen, $fixture->getReference()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + $this->assertNull(Uses::create([])); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotEmpty() + { + $this->assertNull(Uses::create('')); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + Uses::create('body'); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Uses::create('body', new FqsenResolver()); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php new file mode 100644 index 00000000..34f290ad --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php @@ -0,0 +1,200 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\TypeResolver; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\String_; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Var_ + * @covers :: + */ +class VarTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Var_('myVariable', null, new Description('Description')); + + $this->assertSame('var', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Var_('myVariable', new String_(), new Description('Description')); + $this->assertSame('@var string $myVariable Description', $fixture->render()); + + $fixture = new Var_('myVariable', null, new Description('Description')); + $this->assertSame('@var $myVariable Description', $fixture->render()); + + $fixture = new Var_('myVariable'); + $this->assertSame('@var $myVariable', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Var_('myVariable'); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVariableName + */ + public function testHasVariableName() + { + $expected = 'myVariable'; + + $fixture = new Var_($expected); + + $this->assertSame($expected, $fixture->getVariableName()); + } + + /** + * @covers ::__construct + * @covers ::getType + */ + public function testHasType() + { + $expected = new String_(); + + $fixture = new Var_('myVariable', $expected); + + $this->assertSame($expected, $fixture->getType()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Var_('1.0', null, $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\String_ + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Var_('myVariable', new String_(), new Description('Description')); + + $this->assertSame('string $myVariable Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $typeResolver = new TypeResolver(); + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $description = new Description('My Description'); + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Var_::create('string $myVariable My Description', $typeResolver, $descriptionFactory, $context); + + $this->assertSame('string $myVariable My Description', (string)$fixture); + $this->assertSame('myVariable', $fixture->getVariableName()); + $this->assertInstanceOf(String_::class, $fixture->getType()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_:: + * @uses \phpDocumentor\Reflection\TypeResolver + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfEmptyBodyIsGiven() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + Var_::create('', new TypeResolver(), $descriptionFactory); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfBodyIsNotString() + { + Var_::create([]); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfResolverIsNull() + { + Var_::create('body'); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\TypeResolver + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfDescriptionFactoryIsNull() + { + Var_::create('body', new TypeResolver()); + } + + /** + * @covers ::__construct + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfVariableNameIsNotString() + { + new Var_([]); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php new file mode 100644 index 00000000..5c487fd3 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php @@ -0,0 +1,166 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\DocBlock\Tags; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Version + * @covers :: + */ +class VersionTest extends \PHPUnit_Framework_TestCase +{ + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfCorrectTagNameIsReturned() + { + $fixture = new Version('1.0', new Description('Description')); + + $this->assertSame('version', $fixture->getName()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName + */ + public function testIfTagCanBeRenderedUsingDefaultFormatter() + { + $fixture = new Version('1.0', new Description('Description')); + + $this->assertSame('@version 1.0 Description', $fixture->render()); + } + + /** + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render + */ + public function testIfTagCanBeRenderedUsingSpecificFormatter() + { + $fixture = new Version('1.0', new Description('Description')); + + $formatter = m::mock(Formatter::class); + $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output'); + + $this->assertSame('Rendered output', $fixture->render($formatter)); + } + + /** + * @covers ::__construct + * @covers ::getVersion + */ + public function testHasVersionNumber() + { + $expected = '1.0'; + + $fixture = new Version($expected); + + $this->assertSame($expected, $fixture->getVersion()); + } + + /** + * @covers ::__construct + * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testHasDescription() + { + $expected = new Description('Description'); + + $fixture = new Version('1.0', $expected); + + $this->assertSame($expected, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::__toString + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testStringRepresentationIsReturned() + { + $fixture = new Version('1.0', new Description('Description')); + + $this->assertSame('1.0 Description', (string)$fixture); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethod() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $context = new Context(''); + + $version = '1.0'; + $description = new Description('My Description'); + + $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description); + + $fixture = Version::create('1.0 My Description', $descriptionFactory, $context); + + $this->assertSame('1.0 My Description', (string)$fixture); + $this->assertSame($version, $fixture->getVersion()); + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::create + * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version:: + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testFactoryMethodCreatesEmptyVersionTag() + { + $descriptionFactory = m::mock(DescriptionFactory::class); + $descriptionFactory->shouldReceive('create')->never(); + + $fixture = Version::create('', $descriptionFactory, new Context('')); + + $this->assertSame('', (string)$fixture); + $this->assertSame(null, $fixture->getVersion()); + $this->assertSame(null, $fixture->getDescription()); + } + + /** + * @covers ::create + * @expectedException \InvalidArgumentException + */ + public function testFactoryMethodFailsIfVersionIsNotString() + { + $this->assertNull(Version::create([])); + } + + /** + * @covers ::create + */ + public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex() + { + $this->assertNull(Version::create('dkhf<')); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php new file mode 100644 index 00000000..f1261b65 --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php @@ -0,0 +1,290 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use Mockery as m; +use phpDocumentor\Reflection\DocBlock\Description; +use phpDocumentor\Reflection\DocBlock\DescriptionFactory; +use phpDocumentor\Reflection\DocBlock\Tag; +use phpDocumentor\Reflection\DocBlock\TagFactory; +use phpDocumentor\Reflection\DocBlock\Tags\Param; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass phpDocumentor\Reflection\DocBlockFactory + * @covers :: + * @uses \Webmozart\Assert\Assert + * @uses phpDocumentor\Reflection\DocBlock + */ +class DocBlockFactoryTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::__construct + * @covers ::createInstance + * @uses \phpDocumentor\Reflection\DocBlock\StandardTagFactory + * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory + */ + public function testCreateFactoryUsingFactoryMethod() + { + $fixture = DocBlockFactory::createInstance(); + + $this->assertInstanceOf(DocBlockFactory::class, $fixture); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testCreateDocBlockFromReflection() + { + $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class)); + + $docBlock = '/** This is a DocBlock */'; + $classReflector = m::mock(\ReflectionClass::class); + $classReflector->shouldReceive('getDocComment')->andReturn($docBlock); + $docblock = $fixture->create($classReflector); + + $this->assertInstanceOf(DocBlock::class, $docblock); + $this->assertSame('This is a DocBlock', $docblock->getSummary()); + $this->assertEquals(new Description(''), $docblock->getDescription()); + $this->assertSame([], $docblock->getTags()); + $this->assertEquals(new Context(''), $docblock->getContext()); + $this->assertNull($docblock->getLocation()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testCreateDocBlockFromStringWithDocComment() + { + $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class)); + + $docblock = $fixture->create('/** This is a DocBlock */'); + + $this->assertInstanceOf(DocBlock::class, $docblock); + $this->assertSame('This is a DocBlock', $docblock->getSummary()); + $this->assertEquals(new Description(''), $docblock->getDescription()); + $this->assertSame([], $docblock->getTags()); + $this->assertEquals(new Context(''), $docblock->getContext()); + $this->assertNull($docblock->getLocation()); + } + + /** + * @covers ::create + * @covers ::__construct + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testCreateDocBlockFromStringWithoutDocComment() + { + $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class)); + + $docblock = $fixture->create('This is a DocBlock'); + + $this->assertInstanceOf(DocBlock::class, $docblock); + $this->assertSame('This is a DocBlock', $docblock->getSummary()); + $this->assertEquals(new Description(''), $docblock->getDescription()); + $this->assertSame([], $docblock->getTags()); + $this->assertEquals(new Context(''), $docblock->getContext()); + $this->assertNull($docblock->getLocation()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses phpDocumentor\Reflection\DocBlock\Description + * @dataProvider provideSummaryAndDescriptions + */ + public function testSummaryAndDescriptionAreSeparated($given, $summary, $description) + { + $tagFactory = m::mock(TagFactory::class); + $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); + + $docblock = $fixture->create($given); + + $this->assertSame($summary, $docblock->getSummary()); + $this->assertEquals(new Description($description), $docblock->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testDescriptionsRetainFormatting() + { + $tagFactory = m::mock(TagFactory::class); + $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); + + $given = <<create($given); + + $this->assertEquals(new Description($description), $docblock->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::create + * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testTagsAreInterpretedUsingFactory() + { + $tagString = << This is with + multiline description. +TAG; + + $tag = m::mock(Tag::class); + $tagFactory = m::mock(TagFactory::class); + $tagFactory->shouldReceive('create')->with($tagString, m::type(Context::class))->andReturn($tag); + + $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); + + $given = << This is with + * multiline description. + */ +DOCBLOCK; + + $docblock = $fixture->create($given, new Context('')); + + $this->assertEquals([$tag], $docblock->getTags()); + } + + public function provideSummaryAndDescriptions() + { + return [ + ['This is a DocBlock', 'This is a DocBlock', ''], + [ + 'This is a DocBlock. This should still be summary.', + 'This is a DocBlock. This should still be summary.', + '' + ], + [ + <<shouldReceive('create')->with(m::any(), $context)->andReturn(new Param('param')); + $docblock = $fixture->create('/** @param MyType $param */', $context); + } + + /** + * @covers ::__construct + * @covers ::create + * + * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory + * @uses phpDocumentor\Reflection\DocBlock\Description + */ + public function testTagsAreFilteredForNullValues() + { + $tagString = << This is with + multiline description. +TAG; + + $tagFactory = m::mock(TagFactory::class); + $tagFactory->shouldReceive('create')->with($tagString, m::any())->andReturn(null); + + $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory); + + $given = << This is with + * multiline description. + */ +DOCBLOCK; + + $docblock = $fixture->create($given, new Context('')); + + $this->assertEquals([], $docblock->getTags()); + } +} diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php new file mode 100644 index 00000000..4a8d4ded --- /dev/null +++ b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php @@ -0,0 +1,252 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use Mockery as m; +use phpDocumentor\Reflection\Types\Context; + +/** + * @coversDefaultClass phpDocumentor\Reflection\DocBlock + * @covers :: + * @uses \Webmozart\Assert\Assert + */ +class DocBlockTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::__construct + * @covers ::getSummary + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testDocBlockCanHaveASummary() + { + $summary = 'This is a summary'; + + $fixture = new DocBlock($summary); + + $this->assertSame($summary, $fixture->getSummary()); + } + + /** + * @covers ::__construct + * + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfSummaryIsNotAString() + { + new DocBlock([]); + } + + /** + * @covers ::__construct + * + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfTemplateStartIsNotABoolean() + { + new DocBlock('', null, [], null, null, ['is not boolean']); + } + + /** + * @covers ::__construct + * + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfTemplateEndIsNotABoolean() + { + new DocBlock('', null, [], null, null, false, ['is not boolean']); + } + + /** + * @covers ::__construct + * @covers ::getDescription + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testDocBlockCanHaveADescription() + { + $description = new DocBlock\Description(''); + + $fixture = new DocBlock('', $description); + + $this->assertSame($description, $fixture->getDescription()); + } + + /** + * @covers ::__construct + * @covers ::getTags + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tag + */ + public function testDocBlockCanHaveTags() + { + $tags = [ + m::mock(DocBlock\Tag::class) + ]; + + $fixture = new DocBlock('', null, $tags); + + $this->assertSame($tags, $fixture->getTags()); + } + + /** + * @covers ::__construct + * @covers ::getTags + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tag + * + * @expectedException \InvalidArgumentException + */ + public function testDocBlockAllowsOnlyTags() + { + $tags = [ + null + ]; + + $fixture = new DocBlock('', null, $tags); + } + + /** + * @covers ::__construct + * @covers ::getTagsByName + * + * @uses \phpDocumentor\Reflection\DocBlock::getTags + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tag + */ + public function testFindTagsInDocBlockByName() + { + $tag1 = m::mock(DocBlock\Tag::class); + $tag2 = m::mock(DocBlock\Tag::class); + $tag3 = m::mock(DocBlock\Tag::class); + $tags = [$tag1, $tag2, $tag3]; + + $tag1->shouldReceive('getName')->andReturn('abc'); + $tag2->shouldReceive('getName')->andReturn('abcd'); + $tag3->shouldReceive('getName')->andReturn('ab'); + + $fixture = new DocBlock('', null, $tags); + + $this->assertSame([$tag2], $fixture->getTagsByName('abcd')); + $this->assertSame([], $fixture->getTagsByName('Ebcd')); + } + + /** + * @covers ::__construct + * @covers ::getTagsByName + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfNameForTagsIsNotString() + { + $fixture = new DocBlock(); + $fixture->getTagsByName([]); + } + + /** + * @covers ::__construct + * @covers ::hasTag + * + * @uses \phpDocumentor\Reflection\DocBlock::getTags + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\DocBlock\Tag + */ + public function testCheckIfThereAreTagsWithAGivenName() + { + $tag1 = m::mock(DocBlock\Tag::class); + $tag2 = m::mock(DocBlock\Tag::class); + $tag3 = m::mock(DocBlock\Tag::class); + $tags = [$tag1, $tag2, $tag3]; + + $tag1->shouldReceive('getName')->twice()->andReturn('abc'); + $tag2->shouldReceive('getName')->twice()->andReturn('abcd'); + $tag3->shouldReceive('getName')->once(); + + $fixture = new DocBlock('', null, $tags); + + $this->assertTrue($fixture->hasTag('abcd')); + $this->assertFalse($fixture->hasTag('Ebcd')); + } + + /** + * @covers ::__construct + * @covers ::hasTag + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfNameForCheckingTagsIsNotString() + { + $fixture = new DocBlock(); + $fixture->hasTag([]); + } + + /** + * @covers ::__construct + * @covers ::getContext + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Types\Context + */ + public function testDocBlockKnowsInWhichNamespaceItIsAndWhichAliasesThereAre() + { + $context = new Context(''); + + $fixture = new DocBlock('', null, [], $context); + + $this->assertSame($context, $fixture->getContext()); + } + + /** + * @covers ::__construct + * @covers ::getLocation + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + * @uses \phpDocumentor\Reflection\Location + */ + public function testDocBlockKnowsAtWhichLineItIs() + { + $location = new Location(10); + + $fixture = new DocBlock('', null, [], null, $location); + + $this->assertSame($location, $fixture->getLocation()); + } + + /** + * @covers ::__construct + * @covers ::isTemplateStart + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testDocBlockKnowsIfItIsTheStartOfADocBlockTemplate() + { + $fixture = new DocBlock('', null, [], null, null, true); + + $this->assertTrue($fixture->isTemplateStart()); + } + + /** + * @covers ::__construct + * @covers ::isTemplateEnd + * + * @uses \phpDocumentor\Reflection\DocBlock\Description + */ + public function testDocBlockKnowsIfItIsTheEndOfADocBlockTemplate() + { + $fixture = new DocBlock('', null, [], null, null, false, true); + + $this->assertTrue($fixture->isTemplateEnd()); + } +} diff --git a/vendor/phpdocumentor/type-resolver/.gitignore b/vendor/phpdocumentor/type-resolver/.gitignore new file mode 100644 index 00000000..82cfc4e9 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/.gitignore @@ -0,0 +1,3 @@ +.idea +composer.lock +vendor diff --git a/vendor/phpdocumentor/type-resolver/.scrutinizer.yml b/vendor/phpdocumentor/type-resolver/.scrutinizer.yml new file mode 100644 index 00000000..7d7372a8 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/.scrutinizer.yml @@ -0,0 +1,31 @@ +before_commands: + - "composer install --no-dev --prefer-source" + +tools: + external_code_coverage: true + php_code_sniffer: + config: + standard: PSR2 + filter: + paths: ["src/*", "tests/*"] + php_cpd: + enabled: true + excluded_dirs: ["tests", "vendor"] + php_loc: + enabled: true + excluded_dirs: ["tests", "vendor"] + php_mess_detector: + enabled: true + config: + ruleset: phpmd.xml.dist + design_rules: { eval_expression: false } + filter: + paths: ["src/*"] + php_pdepend: + enabled: true + excluded_dirs: ["tests", "vendor"] + php_analyzer: + enabled: true + filter: + paths: ["src/*", "tests/*"] + sensiolabs_security_checker: true diff --git a/vendor/phpdocumentor/type-resolver/.travis.yml b/vendor/phpdocumentor/type-resolver/.travis.yml new file mode 100644 index 00000000..c882b141 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/.travis.yml @@ -0,0 +1,34 @@ +language: php +php: + - 5.5 + - 5.6 + - 7.0 + - hhvm + - nightly + +matrix: + allow_failures: + - php: + - hhvm + - nightly + +cache: + directories: + - $HOME/.composer/cache + +script: + - vendor/bin/phpunit --coverage-clover=coverage.clover -v + - composer update --no-interaction --prefer-source + - vendor/bin/phpunit -v + +before_script: + - composer install --no-interaction + +after_script: + - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi + +notifications: + irc: "irc.freenode.org#phpdocumentor" + email: + - me@mikevanriel.com + - ashnazg@php.net diff --git a/vendor/phpdocumentor/type-resolver/LICENSE b/vendor/phpdocumentor/type-resolver/LICENSE new file mode 100644 index 00000000..792e4040 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010 Mike van Riel + +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/phpdocumentor/type-resolver/README.md b/vendor/phpdocumentor/type-resolver/README.md new file mode 100644 index 00000000..ca8147bc --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/README.md @@ -0,0 +1,169 @@ +TypeResolver and FqsenResolver +============================== + +The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs +but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN). + +PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits +called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods, +properties and class constants but also functions and global constants. + +This package provides two Resolvers that are capable of + +1. Returning a series of Value Object for given expression while resolving any partial class names, and +2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural + Element names. + +## Installing + +The easiest way to install this library is with [Composer](https://getcomposer.org) using the following command: + + $ composer require phpdocumentor/type-resolver + +## Examples + +Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and +check which type of action that your want to accomplish. + +## On Types and Element Names + +This component can be used in one of two ways + +1. To resolve a Type or +2. To resolve a Fully Qualified Structural Element Name + +The big difference between these two is in the number of things it can resolve. + +The TypeResolver can resolve: + +- a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`). +- a composite such as an array of string (`@var string[]`). +- a compound such as a string or integer (`@var string|integer`). +- an object or interface such as the TypeResolver class (`@var TypeResolver` + or `@var \phpDocumentor\Reflection\TypeResolver`) + + > please note that if you want to pass partial class names that additional steps are necessary, see the + > chapter `Resolving partial classes and FQSENs` for more information. + +Where the FqsenResolver can resolve: + +- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`) +- Function expressions (i.e. `@see \MyNamespace\myFunction()`) +- Class expressions (i.e. `@see \MyNamespace\MyClass`) +- Interface expressions (i.e. `@see \MyNamespace\MyInterface`) +- Trait expressions (i.e. `@see \MyNamespace\MyTrait`) +- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`) +- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`) +- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`) + +## Resolving a type + +In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver` +and call its `resolve` method like this: + + $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); + $type = $typeResolver->resolve('string|integer'); + +In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two +elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type +`\phpDocumentor\Reflection\Types\Integer`. + +The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but +in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver +in which namespace the given expression occurs and which namespace aliases (or imports) apply. + +## Resolving an FQSEN + +A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using +the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this: + + $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); + $fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()'); + +In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class +name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`. + +The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural +Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will +inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply. + +## Resolving partial Classes and Structural Element Names + +Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class +names. + +For example, you have this file: + +```php + '\phpDocumentor\Reflection\Types'] + ); + +Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector +object or by providing the namespace that you'd like to extract and the source code of the file in which the given +type expression occurs. + + $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); + $context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct')); + +or + + $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory(); + $context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php')); + +### Using the Context + +After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver +class as second argument and the Resolvers will take this into account when resolving partial names. + +To obtain the resolved class name for the `@var` tag in the example above you can do: + + $typeResolver = new \phpDocumentor\Reflection\TypeResolver(); + $type = $typeResolver->resolve('Types\Context', $context); + +When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call +the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be +`phpDocumentor\Reflection\Types\Context`. + +> Why is the FQSEN wrapped in another object `Object_`? +> +> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common +> type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it +> is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN. + +Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To +resolve that you can do the following: + + $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver(); + $type = $fqsenResolver->resolve('Classy::otherFunction()', $context); + +Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the +`resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to +`\My\Example\Classy::otherFunction()`. diff --git a/vendor/phpdocumentor/type-resolver/composer.json b/vendor/phpdocumentor/type-resolver/composer.json new file mode 100644 index 00000000..abaa965d --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/composer.json @@ -0,0 +1,27 @@ +{ + "name": "phpdocumentor/type-resolver", + "type": "library", + "license": "MIT", + "authors": [ + {"name": "Mike van Riel", "email": "me@mikevanriel.com"} + ], + "require": { + "php": ">=5.5", + "phpdocumentor/reflection-common": "^1.0" + }, + "autoload": { + "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]} + }, + "autoload-dev": { + "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]} + }, + "require-dev": { + "phpunit/phpunit": "^5.2||^4.8.24", + "mockery/mockery": "^0.9.4" + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php b/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php new file mode 100644 index 00000000..682b1d3d --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php @@ -0,0 +1,13 @@ +resolve('string|integer')); + +// Will return the string "string|int" +var_dump((string)$typeResolver->resolve('string|integer')); diff --git a/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php b/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php new file mode 100644 index 00000000..70aa5e42 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php @@ -0,0 +1,12 @@ + 'Mockery' ]); +var_dump((string)$typeResolver->resolve('Types\Resolver|m\MockInterface', $context)); diff --git a/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php b/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php new file mode 100644 index 00000000..4f4282eb --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php @@ -0,0 +1,17 @@ +resolve('Types\Resolver::resolveFqsen()', $context)); + +// Property named: \phpDocumentor\Types\Types\Resolver::$keyWords +var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context)); diff --git a/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php b/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php new file mode 100644 index 00000000..957c97dd --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php @@ -0,0 +1,30 @@ +createFromReflector(new ReflectionClass('My\\Example\\Classy')); + +// Class named: \phpDocumentor\Reflection\Types\Resolver +var_dump((string)$typeResolver->resolve('Types\Resolver', $context)); + +// String +var_dump((string)$typeResolver->resolve('string', $context)); + +// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords +var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context)); + +// Class named: \My\Example\string +// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume +// that the given value is not a type but most definitely a reference to another element. This is +// because conflicts between type keywords and class names can exist and if you know a reference +// is not a type but an element you can force that keywords are resolved. +var_dump((string)$fqsenResolver->resolve('string', $context)); diff --git a/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php b/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php new file mode 100644 index 00000000..10c0c883 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php @@ -0,0 +1,30 @@ +createFromReflector(new ReflectionMethod('My\\Example\\Classy', '__construct')); + +// Class named: \phpDocumentor\Reflection\Types\Resolver +var_dump((string)$typeResolver->resolve('Types\Resolver', $context)); + +// String +var_dump((string)$typeResolver->resolve('string', $context)); + +// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords +var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context)); + +// Class named: \My\Example\string +// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume +// that the given value is not a type but most definitely a reference to another element. This is +// because conflicts between type keywords and class names can exist and if you know a reference +// is not a type but an element you can force that keywords are resolved. +var_dump((string)$fqsenResolver->resolve('string', $context)); diff --git a/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php b/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php new file mode 100644 index 00000000..a93728c8 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php @@ -0,0 +1,22 @@ +createForNamespace('My\Example', file_get_contents('Classy.php')); + +// Class named: \phpDocumentor\Reflection\Types\Resolver +var_dump((string)$typeResolver->resolve('Types\Resolver', $context)); + +// String +var_dump((string)$typeResolver->resolve('string', $context)); + +// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords +var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context)); diff --git a/vendor/phpdocumentor/type-resolver/examples/Classy.php b/vendor/phpdocumentor/type-resolver/examples/Classy.php new file mode 100644 index 00000000..0705266f --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/examples/Classy.php @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + 40 + + + diff --git a/vendor/phpdocumentor/type-resolver/phpunit.xml.dist b/vendor/phpdocumentor/type-resolver/phpunit.xml.dist new file mode 100644 index 00000000..3246bef4 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/phpunit.xml.dist @@ -0,0 +1,31 @@ + + + + + + ./tests/unit + + + + + ./src/ + + + ./examples/ + ./vendor/ + + + + + + diff --git a/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php new file mode 100644 index 00000000..a0e0041c --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php @@ -0,0 +1,76 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\Types\Context; + +class FqsenResolver +{ + /** @var string Definition of the NAMESPACE operator in PHP */ + const OPERATOR_NAMESPACE = '\\'; + + public function resolve($fqsen, Context $context = null) + { + if ($context === null) { + $context = new Context(''); + } + + if ($this->isFqsen($fqsen)) { + return new Fqsen($fqsen); + } + + return $this->resolvePartialStructuralElementName($fqsen, $context); + } + + /** + * Tests whether the given type is a Fully Qualified Structural Element Name. + * + * @param string $type + * + * @return bool + */ + private function isFqsen($type) + { + return strpos($type, self::OPERATOR_NAMESPACE) === 0; + } + + /** + * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation + * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context. + * + * @param string $type + * @param Context $context + * + * @return Fqsen + */ + private function resolvePartialStructuralElementName($type, Context $context) + { + $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2); + + $namespaceAliases = $context->getNamespaceAliases(); + + // if the first segment is not an alias; prepend namespace name and return + if (!isset($namespaceAliases[$typeParts[0]])) { + $namespace = $context->getNamespace(); + if ('' !== $namespace) { + $namespace .= self::OPERATOR_NAMESPACE; + } + + return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type); + } + + $typeParts[0] = $namespaceAliases[$typeParts[0]]; + + return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts)); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Type.php b/vendor/phpdocumentor/type-resolver/src/Type.php new file mode 100644 index 00000000..33ca5595 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Type.php @@ -0,0 +1,18 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +interface Type +{ + public function __toString(); +} diff --git a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php new file mode 100644 index 00000000..3a68a4d3 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php @@ -0,0 +1,266 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use phpDocumentor\Reflection\Types\Array_; +use phpDocumentor\Reflection\Types\Compound; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\Object_; + +final class TypeResolver +{ + /** @var string Definition of the ARRAY operator for types */ + const OPERATOR_ARRAY = '[]'; + + /** @var string Definition of the NAMESPACE operator in PHP */ + const OPERATOR_NAMESPACE = '\\'; + + /** @var string[] List of recognized keywords and unto which Value Object they map */ + private $keywords = array( + 'string' => 'phpDocumentor\Reflection\Types\String_', + 'int' => 'phpDocumentor\Reflection\Types\Integer', + 'integer' => 'phpDocumentor\Reflection\Types\Integer', + 'bool' => 'phpDocumentor\Reflection\Types\Boolean', + 'boolean' => 'phpDocumentor\Reflection\Types\Boolean', + 'float' => 'phpDocumentor\Reflection\Types\Float_', + 'double' => 'phpDocumentor\Reflection\Types\Float_', + 'object' => 'phpDocumentor\Reflection\Types\Object_', + 'mixed' => 'phpDocumentor\Reflection\Types\Mixed', + 'array' => 'phpDocumentor\Reflection\Types\Array_', + 'resource' => 'phpDocumentor\Reflection\Types\Resource', + 'void' => 'phpDocumentor\Reflection\Types\Void_', + 'null' => 'phpDocumentor\Reflection\Types\Null_', + 'scalar' => 'phpDocumentor\Reflection\Types\Scalar', + 'callback' => 'phpDocumentor\Reflection\Types\Callable_', + 'callable' => 'phpDocumentor\Reflection\Types\Callable_', + 'false' => 'phpDocumentor\Reflection\Types\Boolean', + 'true' => 'phpDocumentor\Reflection\Types\Boolean', + 'self' => 'phpDocumentor\Reflection\Types\Self_', + '$this' => 'phpDocumentor\Reflection\Types\This', + 'static' => 'phpDocumentor\Reflection\Types\Static_' + ); + + /** @var FqsenResolver */ + private $fqsenResolver; + + /** + * Initializes this TypeResolver with the means to create and resolve Fqsen objects. + * + * @param FqsenResolver $fqsenResolver + */ + public function __construct(FqsenResolver $fqsenResolver = null) + { + $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver(); + } + + /** + * Analyzes the given type and returns the FQCN variant. + * + * When a type is provided this method checks whether it is not a keyword or + * Fully Qualified Class Name. If so it will use the given namespace and + * aliases to expand the type to a FQCN representation. + * + * This method only works as expected if the namespace and aliases are set; + * no dynamic reflection is being performed here. + * + * @param string $type The relative or absolute type. + * @param Context $context + * + * @uses Context::getNamespace() to determine with what to prefix the type name. + * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be + * replaced with another namespace. + * + * @return Type|null + */ + public function resolve($type, Context $context = null) + { + if (!is_string($type)) { + throw new \InvalidArgumentException( + 'Attempted to resolve type but it appeared not to be a string, received: ' . var_export($type, true) + ); + } + + $type = trim($type); + if (!$type) { + throw new \InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty'); + } + + if ($context === null) { + $context = new Context(''); + } + + switch (true) { + case $this->isKeyword($type): + return $this->resolveKeyword($type); + case ($this->isCompoundType($type)): + return $this->resolveCompoundType($type, $context); + case $this->isTypedArray($type): + return $this->resolveTypedArray($type, $context); + case $this->isFqsen($type): + return $this->resolveTypedObject($type); + case $this->isPartialStructuralElementName($type): + return $this->resolveTypedObject($type, $context); + // @codeCoverageIgnoreStart + default: + // I haven't got the foggiest how the logic would come here but added this as a defense. + throw new \RuntimeException( + 'Unable to resolve type "' . $type . '", there is no known method to resolve it' + ); + } + // @codeCoverageIgnoreEnd + } + + /** + * Adds a keyword to the list of Keywords and associates it with a specific Value Object. + * + * @param string $keyword + * @param string $typeClassName + * + * @return void + */ + public function addKeyword($keyword, $typeClassName) + { + if (!class_exists($typeClassName)) { + throw new \InvalidArgumentException( + 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class' + . ' but we could not find the class ' . $typeClassName + ); + } + + if (!in_array(Type::class, class_implements($typeClassName))) { + throw new \InvalidArgumentException( + 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"' + ); + } + + $this->keywords[$keyword] = $typeClassName; + } + + /** + * Detects whether the given type represents an array. + * + * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. + * + * @return bool + */ + private function isTypedArray($type) + { + return substr($type, -2) === self::OPERATOR_ARRAY; + } + + /** + * Detects whether the given type represents a PHPDoc keyword. + * + * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. + * + * @return bool + */ + private function isKeyword($type) + { + return in_array(strtolower($type), array_keys($this->keywords), true); + } + + /** + * Detects whether the given type represents a relative structural element name. + * + * @param string $type A relative or absolute type as defined in the phpDocumentor documentation. + * + * @return bool + */ + private function isPartialStructuralElementName($type) + { + return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type); + } + + /** + * Tests whether the given type is a Fully Qualified Structural Element Name. + * + * @param string $type + * + * @return bool + */ + private function isFqsen($type) + { + return strpos($type, self::OPERATOR_NAMESPACE) === 0; + } + + /** + * Tests whether the given type is a compound type (i.e. `string|int`). + * + * @param string $type + * + * @return bool + */ + private function isCompoundType($type) + { + return strpos($type, '|') !== false; + } + + /** + * Resolves the given typed array string (i.e. `string[]`) into an Array object with the right types set. + * + * @param string $type + * @param Context $context + * + * @return Array_ + */ + private function resolveTypedArray($type, Context $context) + { + return new Array_($this->resolve(substr($type, 0, -2), $context)); + } + + /** + * Resolves the given keyword (such as `string`) into a Type object representing that keyword. + * + * @param string $type + * + * @return Type + */ + private function resolveKeyword($type) + { + $className = $this->keywords[strtolower($type)]; + + return new $className(); + } + + /** + * Resolves the given FQSEN string into an FQSEN object. + * + * @param string $type + * + * @return Object_ + */ + private function resolveTypedObject($type, Context $context = null) + { + return new Object_($this->fqsenResolver->resolve($type, $context)); + } + + /** + * Resolves a compound type (i.e. `string|int`) into the appropriate Type objects or FQSEN. + * + * @param string $type + * @param Context $context + * + * @return Compound + */ + private function resolveCompoundType($type, Context $context) + { + $types = []; + + foreach (explode('|', $type) as $part) { + $types[] = $this->resolve($part, $context); + } + + return new Compound($types); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php new file mode 100644 index 00000000..45276c6b --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php @@ -0,0 +1,87 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\Type; + +/** + * Represents an array type as described in the PSR-5, the PHPDoc Standard. + * + * An array can be represented in two forms: + * + * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed'. + * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a + * type name. + */ +final class Array_ implements Type +{ + /** @var Type */ + private $valueType; + + /** @var Type */ + private $keyType; + + /** + * Initializes this representation of an array with the given Type or Fqsen. + * + * @param Type $valueType + * @param Type $keyType + */ + public function __construct(Type $valueType = null, Type $keyType = null) + { + if ($keyType === null) { + $keyType = new Compound([ new String_(), new Integer() ]); + } + if ($valueType === null) { + $valueType = new Mixed(); + } + + $this->valueType = $valueType; + $this->keyType = $keyType; + } + + /** + * Returns the type for the keys of this array. + * + * @return Type + */ + public function getKeyType() + { + return $this->keyType; + } + + /** + * Returns the value for the keys of this array. + * + * @return Type + */ + public function getValueType() + { + return $this->valueType; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + if ($this->valueType instanceof Mixed) { + return 'array'; + } + + return $this->valueType . '[]'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php b/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php new file mode 100644 index 00000000..f82b19e5 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing a Boolean type. + */ +final class Boolean implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'bool'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php b/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php new file mode 100644 index 00000000..68ebfbd0 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing a Callable type. + */ +final class Callable_ implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'callable'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php new file mode 100644 index 00000000..3e5ebb5c --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php @@ -0,0 +1,82 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing a Compound Type. + * + * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated + * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type + * may contain a value with any of the given types. + */ +final class Compound implements Type +{ + /** @var Type[] */ + private $types = []; + + /** + * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface. + * + * @param Type[] $types + */ + public function __construct(array $types) + { + foreach ($types as $type) { + if (!$type instanceof Type) { + throw new \InvalidArgumentException('A compound type can only have other types as elements'); + } + } + + $this->types = $types; + } + + /** + * Returns the type at the given index. + * + * @param integer $index + * + * @return Type|null + */ + public function get($index) + { + if (!$this->has($index)) { + return null; + } + + return $this->types[$index]; + } + + /** + * Tests if this compound type has a type with the given index. + * + * @param integer $index + * + * @return bool + */ + public function has($index) + { + return isset($this->types[$index]); + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return implode('|', $this->types); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/vendor/phpdocumentor/type-resolver/src/Types/Context.php new file mode 100644 index 00000000..b4aa8f21 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Context.php @@ -0,0 +1,84 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +/** + * Provides information about the Context in which the DocBlock occurs that receives this context. + * + * A DocBlock does not know of its own accord in which namespace it occurs and which namespace aliases are applicable + * for the block of code in which it is in. This information is however necessary to resolve Class names in tags since + * you can provide a short form or make use of namespace aliases. + * + * The phpDocumentor Reflection component knows how to create this class but if you use the DocBlock parser from your + * own application it is possible to generate a Context class using the ContextFactory; this will analyze the file in + * which an associated class resides for its namespace and imports. + * + * @see ContextFactory::createFromClassReflector() + * @see ContextFactory::createForNamespace() + */ +final class Context +{ + /** @var string The current namespace. */ + private $namespace = ''; + + /** @var array List of namespace aliases => Fully Qualified Namespace. */ + private $namespaceAliases = []; + + /** + * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN) + * format (without a preceding `\`). + * + * @param string $namespace The namespace where this DocBlock resides in. + * @param array $namespaceAliases List of namespace aliases => Fully Qualified Namespace. + */ + public function __construct($namespace, array $namespaceAliases = []) + { + $this->namespace = ('global' !== $namespace && 'default' !== $namespace) + ? trim((string)$namespace, '\\') + : ''; + + foreach ($namespaceAliases as $alias => $fqnn) { + if ($fqnn[0] === '\\') { + $fqnn = substr($fqnn, 1); + } + if ($fqnn[count($fqnn)-1] === '\\') { + $fqnn = substr($fqnn, 0, -1); + } + + $namespaceAliases[$alias] = $fqnn; + } + + $this->namespaceAliases = $namespaceAliases; + } + + /** + * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in. + * + * @return string + */ + public function getNamespace() + { + return $this->namespace; + } + + /** + * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent + * the alias for the imported Namespace. + * + * @return string[] + */ + public function getNamespaceAliases() + { + return $this->namespaceAliases; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php new file mode 100644 index 00000000..147df694 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php @@ -0,0 +1,210 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +/** + * Convenience class to create a Context for DocBlocks when not using the Reflection Component of phpDocumentor. + * + * For a DocBlock to be able to resolve types that use partial namespace names or rely on namespace imports we need to + * provide a bit of context so that the DocBlock can read that and based on it decide how to resolve the types to + * Fully Qualified names. + * + * @see Context for more information. + */ +final class ContextFactory +{ + /** The literal used at the end of a use statement. */ + const T_LITERAL_END_OF_USE = ';'; + + /** The literal used between sets of use statements */ + const T_LITERAL_USE_SEPARATOR = ','; + + /** + * Build a Context given a Class Reflection. + * + * @param \ReflectionClass $reflector + * + * @see Context for more information on Contexts. + * + * @return Context + */ + public function createFromReflector(\Reflector $reflector) + { + if (method_exists($reflector, 'getDeclaringClass')) { + $reflector = $reflector->getDeclaringClass(); + } + + $fileName = $reflector->getFileName(); + $namespace = $reflector->getNamespaceName(); + + if (file_exists($fileName)) { + return $this->createForNamespace($namespace, file_get_contents($fileName)); + } + + return new Context($namespace, []); + } + + /** + * Build a Context for a namespace in the provided file contents. + * + * @param string $namespace It does not matter if a `\` precedes the namespace name, this method first normalizes. + * @param string $fileContents the file's contents to retrieve the aliases from with the given namespace. + * + * @see Context for more information on Contexts. + * + * @return Context + */ + public function createForNamespace($namespace, $fileContents) + { + $namespace = trim($namespace, '\\'); + $useStatements = []; + $currentNamespace = ''; + $tokens = new \ArrayIterator(token_get_all($fileContents)); + + while ($tokens->valid()) { + switch ($tokens->current()[0]) { + case T_NAMESPACE: + $currentNamespace = $this->parseNamespace($tokens); + break; + case T_CLASS: + // Fast-forward the iterator through the class so that any + // T_USE tokens found within are skipped - these are not + // valid namespace use statements so should be ignored. + $braceLevel = 0; + $firstBraceFound = false; + while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) { + if ($tokens->current() === '{' + || $tokens->current()[0] === T_CURLY_OPEN + || $tokens->current()[0] === T_DOLLAR_OPEN_CURLY_BRACES) { + if (!$firstBraceFound) { + $firstBraceFound = true; + } + $braceLevel++; + } + + if ($tokens->current() === '}') { + $braceLevel--; + } + $tokens->next(); + } + break; + case T_USE: + if ($currentNamespace === $namespace) { + $useStatements = array_merge($useStatements, $this->parseUseStatement($tokens)); + } + break; + } + $tokens->next(); + } + + return new Context($namespace, $useStatements); + } + + /** + * Deduce the name from tokens when we are at the T_NAMESPACE token. + * + * @param \ArrayIterator $tokens + * + * @return string + */ + private function parseNamespace(\ArrayIterator $tokens) + { + // skip to the first string or namespace separator + $this->skipToNextStringOrNamespaceSeparator($tokens); + + $name = ''; + while ($tokens->valid() && ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) + ) { + $name .= $tokens->current()[1]; + $tokens->next(); + } + + return $name; + } + + /** + * Deduce the names of all imports when we are at the T_USE token. + * + * @param \ArrayIterator $tokens + * + * @return string[] + */ + private function parseUseStatement(\ArrayIterator $tokens) + { + $uses = []; + $continue = true; + + while ($continue) { + $this->skipToNextStringOrNamespaceSeparator($tokens); + + list($alias, $fqnn) = $this->extractUseStatement($tokens); + $uses[$alias] = $fqnn; + if ($tokens->current()[0] === self::T_LITERAL_END_OF_USE) { + $continue = false; + } + } + + return $uses; + } + + /** + * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token. + * + * @param \ArrayIterator $tokens + * + * @return void + */ + private function skipToNextStringOrNamespaceSeparator(\ArrayIterator $tokens) + { + while ($tokens->valid() && ($tokens->current()[0] !== T_STRING) && ($tokens->current()[0] !== T_NS_SEPARATOR)) { + $tokens->next(); + } + } + + /** + * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of + * a USE statement yet. + * + * @param \ArrayIterator $tokens + * + * @return string + */ + private function extractUseStatement(\ArrayIterator $tokens) + { + $result = ['']; + while ($tokens->valid() + && ($tokens->current()[0] !== self::T_LITERAL_USE_SEPARATOR) + && ($tokens->current()[0] !== self::T_LITERAL_END_OF_USE) + ) { + if ($tokens->current()[0] === T_AS) { + $result[] = ''; + } + if ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) { + $result[count($result) - 1] .= $tokens->current()[1]; + } + $tokens->next(); + } + + if (count($result) == 1) { + $backslashPos = strrpos($result[0], '\\'); + + if (false !== $backslashPos) { + $result[] = substr($result[0], $backslashPos + 1); + } else { + $result[] = $result[0]; + } + } + + return array_reverse($result); + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php new file mode 100644 index 00000000..e58d8966 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Float_.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing a Float. + */ +final class Float_ implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'float'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Integer.php b/vendor/phpdocumentor/type-resolver/src/Types/Integer.php new file mode 100644 index 00000000..be4555ef --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Integer.php @@ -0,0 +1,28 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +final class Integer implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'int'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php b/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php new file mode 100644 index 00000000..79695f45 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing an unknown, or mixed, type. + */ +final class Mixed implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'mixed'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Null_.php b/vendor/phpdocumentor/type-resolver/src/Types/Null_.php new file mode 100644 index 00000000..203b4227 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Null_.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing a null value or type. + */ +final class Null_ implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'null'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php new file mode 100644 index 00000000..b337c715 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Object_.php @@ -0,0 +1,70 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Fqsen; +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing an object. + * + * An object can be either typed or untyped. When an object is typed it means that it has an identifier, the FQSEN, + * pointing to an element in PHP. Object types that are untyped do not refer to a specific class but represent objects + * in general. + */ +final class Object_ implements Type +{ + /** @var Fqsen|null */ + private $fqsen; + + /** + * Initializes this object with an optional FQSEN, if not provided this object is considered 'untyped'. + * + * @param Fqsen $fqsen + */ + public function __construct(Fqsen $fqsen = null) + { + if (strpos((string)$fqsen, '::') !== false || strpos((string)$fqsen, '()') !== false) { + throw new \InvalidArgumentException( + 'Object types can only refer to a class, interface or trait but a method, function, constant or ' + . 'property was received: ' . (string)$fqsen + ); + } + + $this->fqsen = $fqsen; + } + + /** + * Returns the FQSEN associated with this object. + * + * @return Fqsen|null + */ + public function getFqsen() + { + return $this->fqsen; + } + + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + if ($this->fqsen) { + return (string)$this->fqsen; + } + + return 'object'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Resource.php b/vendor/phpdocumentor/type-resolver/src/Types/Resource.php new file mode 100644 index 00000000..2c2526b7 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Resource.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing the 'resource' Type. + */ +final class Resource implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'resource'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php b/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php new file mode 100644 index 00000000..1e2a6602 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing the 'scalar' pseudo-type, which is either a string, integer, float or boolean. + */ +final class Scalar implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'scalar'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Self_.php b/vendor/phpdocumentor/type-resolver/src/Types/Self_.php new file mode 100644 index 00000000..1ba3fc5a --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Self_.php @@ -0,0 +1,33 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing the 'self' type. + * + * Self, as a Type, represents the class in which the associated element was defined. + */ +final class Self_ implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'self'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Static_.php b/vendor/phpdocumentor/type-resolver/src/Types/Static_.php new file mode 100644 index 00000000..9eb67299 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Static_.php @@ -0,0 +1,38 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing the 'static' type. + * + * Self, as a Type, represents the class in which the associated element was called. This differs from self as self does + * not take inheritance into account but static means that the return type is always that of the class of the called + * element. + * + * See the documentation on late static binding in the PHP Documentation for more information on the difference between + * static and self. + */ +final class Static_ implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'static'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/String_.php b/vendor/phpdocumentor/type-resolver/src/Types/String_.php new file mode 100644 index 00000000..8db59685 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/String_.php @@ -0,0 +1,31 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing the type 'string'. + */ +final class String_ implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'string'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/This.php b/vendor/phpdocumentor/type-resolver/src/Types/This.php new file mode 100644 index 00000000..c098a939 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/This.php @@ -0,0 +1,34 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing the '$this' pseudo-type. + * + * $this, as a Type, represents the instance of the class associated with the element as it was called. $this is + * commonly used when documenting fluent interfaces since it represents that the same object is returned. + */ +final class This implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return '$this'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Void_.php b/vendor/phpdocumentor/type-resolver/src/Types/Void_.php new file mode 100644 index 00000000..3d1be272 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/src/Types/Void_.php @@ -0,0 +1,34 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use phpDocumentor\Reflection\Type; + +/** + * Value Object representing the pseudo-type 'void'. + * + * Void is generally only used when working with return types as it signifies that the method intentionally does not + * return any value. + */ +final class Void_ implements Type +{ + /** + * Returns a rendered output of the Type as it would be used in a DocBlock. + * + * @return string + */ + public function __toString() + { + return 'void'; + } +} diff --git a/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php b/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php new file mode 100644 index 00000000..f226f8ed --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php @@ -0,0 +1,395 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection; + +use Mockery as m; +use phpDocumentor\Reflection\Types\Array_; +use phpDocumentor\Reflection\Types\Compound; +use phpDocumentor\Reflection\Types\Context; +use phpDocumentor\Reflection\Types\Object_; + +/** + * @coversDefaultClass phpDocumentor\Reflection\TypeResolver + */ +class TypeResolverTest extends \PHPUnit_Framework_TestCase +{ + /** + * @param string $keyword + * @param string $expectedClass + * + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Array_ + * @uses phpDocumentor\Reflection\Types\Object_ + * + * @dataProvider provideKeywords + */ + public function testResolvingKeywords($keyword, $expectedClass) + { + $fixture = new TypeResolver(); + + $resolvedType = $fixture->resolve($keyword, new Context('')); + + $this->assertInstanceOf($expectedClass, $resolvedType); + } + + /** + * @param string $fqsen + * + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Object_ + * @uses phpDocumentor\Reflection\Fqsen + * @uses phpDocumentor\Reflection\FqsenResolver + * + * @dataProvider provideFqcn + */ + public function testResolvingFQSENs($fqsen) + { + $fixture = new TypeResolver(); + + /** @var Object_ $resolvedType */ + $resolvedType = $fixture->resolve($fqsen, new Context('')); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType); + $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen()); + $this->assertSame($fqsen, (string)$resolvedType); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Object_ + * @uses phpDocumentor\Reflection\Fqsen + * @uses phpDocumentor\Reflection\FqsenResolver + */ + public function testResolvingRelativeQSENsBasedOnNamespace() + { + $fixture = new TypeResolver(); + + /** @var Object_ $resolvedType */ + $resolvedType = $fixture->resolve('DocBlock', new Context('phpDocumentor\Reflection')); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType); + $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen()); + $this->assertSame('\phpDocumentor\Reflection\DocBlock', (string)$resolvedType); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Object_ + * @uses phpDocumentor\Reflection\Fqsen + * @uses phpDocumentor\Reflection\FqsenResolver + */ + public function testResolvingRelativeQSENsBasedOnNamespaceAlias() + { + $fixture = new TypeResolver(); + + /** @var Object_ $resolvedType */ + $resolvedType = $fixture->resolve( + 'm\MockInterface', + new Context('phpDocumentor\Reflection', ['m' => '\Mockery']) + ); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType); + $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen()); + $this->assertSame('\Mockery\MockInterface', (string)$resolvedType); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Array_ + * @uses phpDocumentor\Reflection\Types\String_ + */ + public function testResolvingTypedArrays() + { + $fixture = new TypeResolver(); + + /** @var Array_ $resolvedType */ + $resolvedType = $fixture->resolve('string[]', new Context('')); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType); + $this->assertSame('string[]', (string)$resolvedType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType()); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $resolvedType->getValueType()); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Array_ + * @uses phpDocumentor\Reflection\Types\String_ + */ + public function testResolvingNestedTypedArrays() + { + $fixture = new TypeResolver(); + + /** @var Array_ $resolvedType */ + $resolvedType = $fixture->resolve('string[][]', new Context('')); + + /** @var Array_ $childValueType */ + $childValueType = $resolvedType->getValueType(); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType); + + $this->assertSame('string[][]', (string)$resolvedType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType()); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $childValueType); + + $this->assertSame('string[]', (string)$childValueType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $childValueType->getKeyType()); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $childValueType->getValueType()); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Compound + * @uses phpDocumentor\Reflection\Types\String_ + * @uses phpDocumentor\Reflection\Types\Object_ + * @uses phpDocumentor\Reflection\Fqsen + * @uses phpDocumentor\Reflection\FqsenResolver + */ + public function testResolvingCompoundTypes() + { + $fixture = new TypeResolver(); + + /** @var Compound $resolvedType */ + $resolvedType = $fixture->resolve('string|Reflection\DocBlock', new Context('phpDocumentor')); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType); + $this->assertSame('string|\phpDocumentor\Reflection\DocBlock', (string)$resolvedType); + + /** @var String $secondType */ + $firstType = $resolvedType->get(0); + + /** @var Object_ $secondType */ + $secondType = $resolvedType->get(1); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $firstType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType); + $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $secondType->getFqsen()); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Compound + * @uses phpDocumentor\Reflection\Types\Array_ + * @uses phpDocumentor\Reflection\Types\Object_ + * @uses phpDocumentor\Reflection\Fqsen + * @uses phpDocumentor\Reflection\FqsenResolver + */ + public function testResolvingCompoundTypedArrayTypes() + { + $fixture = new TypeResolver(); + + /** @var Compound $resolvedType */ + $resolvedType = $fixture->resolve('\stdClass[]|Reflection\DocBlock[]', new Context('phpDocumentor')); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType); + $this->assertSame('\stdClass[]|\phpDocumentor\Reflection\DocBlock[]', (string)$resolvedType); + + /** @var Array_ $secondType */ + $firstType = $resolvedType->get(0); + + /** @var Array_ $secondType */ + $secondType = $resolvedType->get(1); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $firstType->getValueType()); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType->getValueType()); + } + + /** + * This test asserts that the parameter order is correct. + * + * When you pass two arrays separated by the compound operator (i.e. 'integer[]|string[]') then we always split the + * expression in its compound parts and then we parse the types with the array operators. If we were to switch the + * order around then 'integer[]|string[]' would read as an array of string or integer array; which is something + * other than what we intend. + * + * @covers ::__construct + * @covers ::resolve + * @covers :: + * + * @uses phpDocumentor\Reflection\Types\Context + * @uses phpDocumentor\Reflection\Types\Compound + * @uses phpDocumentor\Reflection\Types\Array_ + * @uses phpDocumentor\Reflection\Types\Integer + * @uses phpDocumentor\Reflection\Types\String_ + */ + public function testResolvingCompoundTypesWithTwoArrays() + { + $fixture = new TypeResolver(); + + /** @var Compound $resolvedType */ + $resolvedType = $fixture->resolve('integer[]|string[]', new Context('')); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType); + $this->assertSame('int[]|string[]', (string)$resolvedType); + + /** @var Array_ $firstType */ + $firstType = $resolvedType->get(0); + + /** @var Array_ $secondType */ + $secondType = $resolvedType->get(1); + + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Integer', $firstType->getValueType()); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType); + $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $secondType->getValueType()); + } + + /** + * @covers ::__construct + * @covers ::addKeyword + * @uses phpDocumentor\Reflection\TypeResolver::resolve + * @uses phpDocumentor\Reflection\TypeResolver:: + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testAddingAKeyword() + { + // Assign + $typeMock = m::mock(Type::class); + + // Act + $fixture = new TypeResolver(); + $fixture->addKeyword('mock', get_class($typeMock)); + + // Assert + $result = $fixture->resolve('mock', new Context('')); + $this->assertInstanceOf(get_class($typeMock), $result); + $this->assertNotSame($typeMock, $result); + } + + /** + * @covers ::__construct + * @covers ::addKeyword + * @uses phpDocumentor\Reflection\Types\Context + * @expectedException \InvalidArgumentException + */ + public function testAddingAKeywordFailsIfTypeClassDoesNotExist() + { + $fixture = new TypeResolver(); + $fixture->addKeyword('mock', 'IDoNotExist'); + } + + /** + * @covers ::__construct + * @covers ::addKeyword + * @uses phpDocumentor\Reflection\Types\Context + * @expectedException \InvalidArgumentException + */ + public function testAddingAKeywordFailsIfTypeClassDoesNotImplementTypeInterface() + { + $fixture = new TypeResolver(); + $fixture->addKeyword('mock', 'stdClass'); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @uses phpDocumentor\Reflection\Types\Context + * + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfTypeIsEmpty() + { + $fixture = new TypeResolver(); + $fixture->resolve(' ', new Context('')); + } + + /** + * @covers ::__construct + * @covers ::resolve + * @uses phpDocumentor\Reflection\Types\Context + * + * @expectedException \InvalidArgumentException + */ + public function testExceptionIsThrownIfTypeIsNotAString() + { + $fixture = new TypeResolver(); + $fixture->resolve(['a'], new Context('')); + } + + /** + * Returns a list of keywords and expected classes that are created from them. + * + * @return string[][] + */ + public function provideKeywords() + { + return [ + ['string', 'phpDocumentor\Reflection\Types\String_'], + ['int', 'phpDocumentor\Reflection\Types\Integer'], + ['integer', 'phpDocumentor\Reflection\Types\Integer'], + ['float', 'phpDocumentor\Reflection\Types\Float_'], + ['double', 'phpDocumentor\Reflection\Types\Float_'], + ['bool', 'phpDocumentor\Reflection\Types\Boolean'], + ['boolean', 'phpDocumentor\Reflection\Types\Boolean'], + ['resource', 'phpDocumentor\Reflection\Types\Resource'], + ['null', 'phpDocumentor\Reflection\Types\Null_'], + ['callable', 'phpDocumentor\Reflection\Types\Callable_'], + ['callback', 'phpDocumentor\Reflection\Types\Callable_'], + ['array', 'phpDocumentor\Reflection\Types\Array_'], + ['scalar', 'phpDocumentor\Reflection\Types\Scalar'], + ['object', 'phpDocumentor\Reflection\Types\Object_'], + ['mixed', 'phpDocumentor\Reflection\Types\Mixed'], + ['void', 'phpDocumentor\Reflection\Types\Void_'], + ['$this', 'phpDocumentor\Reflection\Types\This'], + ['static', 'phpDocumentor\Reflection\Types\Static_'], + ['self', 'phpDocumentor\Reflection\Types\Self_'], + ]; + } + + /** + * Provides a list of FQSENs to test the resolution patterns with. + * + * @return string[][] + */ + public function provideFqcn() + { + return [ + 'namespace' => ['\phpDocumentor\Reflection'], + 'class' => ['\phpDocumentor\Reflection\DocBlock'], + ]; + } +} diff --git a/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php b/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php new file mode 100644 index 00000000..20d63c95 --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php @@ -0,0 +1,188 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types { + +// Added imports on purpose as mock for the unit tests, please do not remove. + use Mockery as m; + use phpDocumentor\Reflection\DocBlock, + phpDocumentor\Reflection\DocBlock\Tag; + use phpDocumentor; + use \ReflectionClass; // yes, the slash is part of the test + + /** + * @coversDefaultClass \phpDocumentor\Reflection\Types\ContextFactory + * @covers :: + */ + class ContextFactoryTest extends \PHPUnit_Framework_TestCase + { + /** + * @covers ::createFromReflector + * @covers ::createForNamespace + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testReadsNamespaceFromClassReflection() + { + $fixture = new ContextFactory(); + $context = $fixture->createFromReflector(new ReflectionClass($this)); + + $this->assertSame(__NAMESPACE__, $context->getNamespace()); + } + + /** + * @covers ::createFromReflector + * @covers ::createForNamespace + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testReadsAliasesFromClassReflection() + { + $fixture = new ContextFactory(); + $expected = [ + 'm' => 'Mockery', + 'DocBlock' => 'phpDocumentor\Reflection\DocBlock', + 'Tag' => 'phpDocumentor\Reflection\DocBlock\Tag', + 'phpDocumentor' => 'phpDocumentor', + 'ReflectionClass' => 'ReflectionClass' + ]; + $context = $fixture->createFromReflector(new ReflectionClass($this)); + + $this->assertSame($expected, $context->getNamespaceAliases()); + } + + /** + * @covers ::createForNamespace + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testReadsNamespaceFromProvidedNamespaceAndContent() + { + $fixture = new ContextFactory(); + $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__)); + + $this->assertSame(__NAMESPACE__, $context->getNamespace()); + } + + /** + * @covers ::createForNamespace + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testReadsAliasesFromProvidedNamespaceAndContent() + { + $fixture = new ContextFactory(); + $expected = [ + 'm' => 'Mockery', + 'DocBlock' => 'phpDocumentor\Reflection\DocBlock', + 'Tag' => 'phpDocumentor\Reflection\DocBlock\Tag', + 'phpDocumentor' => 'phpDocumentor', + 'ReflectionClass' => 'ReflectionClass' + ]; + $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__)); + + $this->assertSame($expected, $context->getNamespaceAliases()); + } + + /** + * @covers ::createForNamespace + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testTraitUseIsNotDetectedAsNamespaceUse() + { + $php = "createForNamespace('Foo', $php); + + $this->assertSame([], $context->getNamespaceAliases()); + } + + /** + * @covers ::createForNamespace + * @uses phpDocumentor\Reflection\Types\Context + */ + public function testAllOpeningBracesAreCheckedWhenSearchingForEndOfClass() + { + $php = 'createForNamespace('Foo', $php); + + $this->assertSame([], $context->getNamespaceAliases()); + } + + /** + * @covers ::createFromReflector + */ + public function testEmptyFileName() + { + $fixture = new ContextFactory(); + $context = $fixture->createFromReflector(new \ReflectionClass('stdClass')); + + $this->assertSame([], $context->getNamespaceAliases()); + } + + /** + * @covers ::createFromReflector + */ + public function testEvalDClass() + { + eval(<<createFromReflector(new \ReflectionClass('Foo\Bar')); + + $this->assertSame([], $context->getNamespaceAliases()); + } + } +} + +namespace phpDocumentor\Reflection\Types\Mock { + // the following import should not show in the tests above + use phpDocumentor\Reflection\DocBlock\Description; +} diff --git a/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php b/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php new file mode 100644 index 00000000..165f415d --- /dev/null +++ b/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php @@ -0,0 +1,61 @@ + + * @license http://www.opensource.org/licenses/mit-license.php MIT + * @link http://phpdoc.org + */ + +namespace phpDocumentor\Reflection\Types; + +use Mockery as m; + +/** + * @coversDefaultClass \phpDocumentor\Reflection\Types\Context + */ +class ContextTest extends \PHPUnit_Framework_TestCase +{ + /** + * @covers ::__construct + * @covers ::getNamespace + */ + public function testProvidesANormalizedNamespace() + { + $fixture = new Context('\My\Space'); + $this->assertSame('My\Space', $fixture->getNamespace()); + } + + /** + * @covers ::__construct + * @covers ::getNamespace + */ + public function testInterpretsNamespaceNamedGlobalAsRootNamespace() + { + $fixture = new Context('global'); + $this->assertSame('', $fixture->getNamespace()); + } + + /** + * @covers ::__construct + * @covers ::getNamespace + */ + public function testInterpretsNamespaceNamedDefaultAsRootNamespace() + { + $fixture = new Context('default'); + $this->assertSame('', $fixture->getNamespace()); + } + + /** + * @covers ::__construct + * @covers ::getNamespaceAliases + */ + public function testProvidesNormalizedNamespaceAliases() + { + $fixture = new Context('', ['Space' => '\My\Space']); + $this->assertSame(['Space' => 'My\Space'], $fixture->getNamespaceAliases()); + } +} diff --git a/vendor/phpspec/prophecy/.gitignore b/vendor/phpspec/prophecy/.gitignore index c50c8c4a..0c93fcf3 100644 --- a/vendor/phpspec/prophecy/.gitignore +++ b/vendor/phpspec/prophecy/.gitignore @@ -1,4 +1,4 @@ *.tgz *.phar -bin -vendor +/composer.lock +/vendor diff --git a/vendor/phpspec/prophecy/.travis.yml b/vendor/phpspec/prophecy/.travis.yml index 004e612a..e75c39ef 100644 --- a/vendor/phpspec/prophecy/.travis.yml +++ b/vendor/phpspec/prophecy/.travis.yml @@ -1,6 +1,6 @@ language: php -php: [5.3, 5.4, 5.5, 5.6, 7, hhvm] +php: [5.3, 5.4, 5.5, 5.6, 7.0, hhvm] sudo: false @@ -14,6 +14,16 @@ branches: - /^feature\/.*$/ - /^optimization\/.*$/ -before_script: travis_retry composer install --no-interaction +matrix: + fast_finish: true + include: + - php: '7.0' + env: PHPDOCUMENTOR_REFLECTION_DOCBLOCK="^2.0" + +before_script: + - if [ -n "$PHPDOCUMENTOR_REFLECTION_DOCBLOCK" ]; then + composer require "phpdocumentor/reflection-docblock:${PHPDOCUMENTOR_REFLECTION_DOCBLOCK}" --no-update; + fi; + - travis_retry composer update --no-interaction script: vendor/bin/phpspec run -fpretty -v diff --git a/vendor/phpspec/prophecy/CHANGES.md b/vendor/phpspec/prophecy/CHANGES.md index c9b0b999..444c1fa6 100644 --- a/vendor/phpspec/prophecy/CHANGES.md +++ b/vendor/phpspec/prophecy/CHANGES.md @@ -1,3 +1,10 @@ +1.6.1 / 2016-06-07 +================== + + * Ignored empty method names in invalid `@method` phpdoc + * Fixed the mocking of SplFileObject + * Added compatibility with phpdocumentor/reflection-docblock 3 + 1.6.0 / 2016-02-15 ================== diff --git a/vendor/phpspec/prophecy/composer.json b/vendor/phpspec/prophecy/composer.json index 15be6735..23131b20 100644 --- a/vendor/phpspec/prophecy/composer.json +++ b/vendor/phpspec/prophecy/composer.json @@ -16,16 +16,17 @@ "email": "marcello.duarte@gmail.com" } ], + "require": { "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "sebastian/comparator": "^1.1", "doctrine/instantiator": "^1.0.2", - "sebastian/recursion-context": "~1.0" + "sebastian/recursion-context": "^1.0" }, "require-dev": { - "phpspec/phpspec": "~2.0" + "phpspec/phpspec": "^2.0" }, "autoload": { @@ -36,7 +37,7 @@ "extra": { "branch-alias": { - "dev-master": "1.5.x-dev" + "dev-master": "1.6.x-dev" } } } diff --git a/vendor/phpspec/prophecy/composer.lock b/vendor/phpspec/prophecy/composer.lock deleted file mode 100644 index 795005ad..00000000 --- a/vendor/phpspec/prophecy/composer.lock +++ /dev/null @@ -1,720 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", - "This file is @generated automatically" - ], - "hash": "0cb11a8d8108277277f9931f6e4fa947", - "content-hash": "d2c6dc828e1217dfa154bc2dbb431edb", - "packages": [ - { - "name": "doctrine/instantiator", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", - "shasum": "" - }, - "require": { - "php": ">=5.3,<8.0-DEV" - }, - "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2015-06-14 21:17:01" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03 12:10:50" - }, - { - "name": "sebastian/comparator", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", - "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2015-07-26 15:48:44" - }, - { - "name": "sebastian/diff", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3", - "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "http://www.github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2015-02-22 15:13:53" - }, - { - "name": "sebastian/exporter", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", - "reference": "7ae5513327cb536431847bcc0c10edba2701064e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2015-06-21 07:55:53" - }, - { - "name": "sebastian/recursion-context", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", - "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-06-21 08:04:50" - } - ], - "packages-dev": [ - { - "name": "phpspec/php-diff", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/phpspec/php-diff.git", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/php-diff/zipball/30e103d19519fe678ae64a60d77884ef3d71b28a", - "reference": "30e103d19519fe678ae64a60d77884ef3d71b28a", - "shasum": "" - }, - "type": "library", - "autoload": { - "psr-0": { - "Diff": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Chris Boulton", - "homepage": "http://github.com/chrisboulton", - "role": "Original developer" - } - ], - "description": "A comprehensive library for generating differences between two hashable objects (strings or arrays).", - "time": "2013-11-01 13:02:21" - }, - { - "name": "phpspec/phpspec", - "version": "2.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/phpspec.git", - "reference": "36635a903bdeb54899d7407bc95610501fd98559" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/phpspec/zipball/36635a903bdeb54899d7407bc95610501fd98559", - "reference": "36635a903bdeb54899d7407bc95610501fd98559", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.1", - "php": ">=5.3.3", - "phpspec/php-diff": "~1.0.0", - "phpspec/prophecy": "~1.4", - "sebastian/exporter": "~1.0", - "symfony/console": "~2.3", - "symfony/event-dispatcher": "~2.1", - "symfony/finder": "~2.1", - "symfony/process": "^2.6", - "symfony/yaml": "~2.1" - }, - "require-dev": { - "behat/behat": "^3.0.11", - "bossa/phpspec2-expect": "~1.0", - "phpunit/phpunit": "~4.4", - "symfony/filesystem": "~2.1" - }, - "suggest": { - "phpspec/nyan-formatters": "~1.0 ā€“ Adds Nyan formatters" - }, - "bin": [ - "bin/phpspec" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "psr-0": { - "PhpSpec": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "homepage": "http://marcelloduarte.net/" - } - ], - "description": "Specification-oriented BDD framework for PHP 5.3+", - "homepage": "http://phpspec.net/", - "keywords": [ - "BDD", - "SpecBDD", - "TDD", - "spec", - "specification", - "testing", - "tests" - ], - "time": "2015-09-07 07:07:37" - }, - { - "name": "symfony/console", - "version": "v2.7.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "5efd632294c8320ea52492db22292ff853a43766" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766", - "reference": "5efd632294c8320ea52492db22292ff853a43766", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1", - "symfony/process": "~2.1" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/process": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - } - }, - "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 Console Component", - "homepage": "https://symfony.com", - "time": "2015-10-20 14:38:46" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.7.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8", - "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0,>=2.0.5", - "symfony/dependency-injection": "~2.6", - "symfony/expression-language": "~2.6", - "symfony/stopwatch": "~2.3" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "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 EventDispatcher Component", - "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" - }, - { - "name": "symfony/finder", - "version": "v2.7.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", - "reference": "2ffb4e9598db3c48eb6d0ae73b04bbf09280c59d", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - } - }, - "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 Finder Component", - "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" - }, - { - "name": "symfony/process", - "version": "v2.7.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7", - "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - } - }, - "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 Process Component", - "homepage": "https://symfony.com", - "time": "2015-10-23 14:47:27" - }, - { - "name": "symfony/yaml", - "version": "v2.7.6", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "eca9019c88fbe250164affd107bc8057771f3f4d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d", - "reference": "eca9019c88fbe250164affd107bc8057771f3f4d", - "shasum": "" - }, - "require": { - "php": ">=5.3.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - } - }, - "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 Yaml Component", - "homepage": "https://symfony.com", - "time": "2015-10-11 09:39:48" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": [], - "platform-dev": [] -} diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php index 18ea23ad..edd8b80d 100644 --- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php @@ -46,6 +46,18 @@ function it_ignores_existing_methods($node) $this->apply($node); } + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + */ + function it_ignores_empty_methods_from_phpdoc($node) + { + $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiInvalidMethodDefinition'); + + $node->addMethod(new MethodNode(''))->shouldNotBeCalled(); + + $this->apply($node); + } + /** * @param \Prophecy\Doubler\Generator\Node\ClassNode $node */ @@ -79,6 +91,15 @@ public function definedMethod() } } +/** + * @method void invalidMethodDefinition + * @method void + * @method + */ +class MagicalApiInvalidMethodDefinition +{ +} + /** * @method void undefinedMethod() * @method void definedMethod() diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php index 37fe82f6..42e854ac 100644 --- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php +++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php @@ -88,4 +88,20 @@ function it_should_not_supply_a_file_for_a_directory_iterator($node, $method) $this->apply($node); } + /** + * @param \Prophecy\Doubler\Generator\Node\ClassNode $node + * @param \Prophecy\Doubler\Generator\Node\MethodNode $method + */ + function it_should_supply_a_file_for_a_spl_file_object($node, $method) + { + $node->hasMethod('__construct')->willReturn(true); + $node->getMethod('__construct')->willReturn($method); + $node->getParentClass()->willReturn('SplFileObject'); + + $method->setCode(Argument::that(function($value) { + return strpos($value, '.php') !== false; + }))->shouldBeCalled(); + + $this->apply($node); + } } diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php index 08126d98..23891c09 100644 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php @@ -11,17 +11,27 @@ namespace Prophecy\Doubler\ClassPatch; -use phpDocumentor\Reflection\DocBlock; use Prophecy\Doubler\Generator\Node\ClassNode; use Prophecy\Doubler\Generator\Node\MethodNode; +use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever; +use Prophecy\PhpDocumentor\MethodTagRetrieverInterface; /** * Discover Magical API using "@method" PHPDoc format. * * @author Thomas Tourlourat + * @author KĆ©vin Dunglas + * @author ThĆ©o FIDRY */ class MagicCallPatch implements ClassPatchInterface { + private $tagRetriever; + + public function __construct(MethodTagRetrieverInterface $tagRetriever = null) + { + $this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever; + } + /** * Support any class * @@ -44,21 +54,17 @@ public function apply(ClassNode $node) $parentClass = $node->getParentClass(); $reflectionClass = new \ReflectionClass($parentClass); - $phpdoc = new DocBlock($reflectionClass->getDocComment()); - - $tagList = $phpdoc->getTagsByName('method'); - - $interfaces = $reflectionClass->getInterfaces(); - foreach($interfaces as $interface) { - $phpdoc = new DocBlock($interface); - $tagList = array_merge($tagList, $phpdoc->getTagsByName('method')); - } + $tagList = $this->tagRetriever->getTagList($reflectionClass); foreach($tagList as $tag) { $methodName = $tag->getMethodName(); + if (empty($methodName)) { + continue; + } + if (!$reflectionClass->hasMethod($methodName)) { - $methodNode = new MethodNode($tag->getMethodName()); + $methodNode = new MethodNode($methodName); $methodNode->setStatic($tag->isStatic()); $node->addMethod($methodNode); diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php index 84011598..eba82980 100644 --- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php +++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php @@ -56,6 +56,13 @@ public function apply(ClassNode $node) if ($this->nodeIsDirectoryIterator($node)) { $constructor->setCode('return parent::__construct("' . __DIR__ . '");'); + + return; + } + + if ($this->nodeIsSplFileObject($node)) { + $constructor->setCode('return parent::__construct("' . __FILE__ .'");'); + return; } @@ -79,7 +86,20 @@ public function getPriority() private function nodeIsDirectoryIterator(ClassNode $node) { $parent = $node->getParentClass(); + return 'DirectoryIterator' === $parent || is_subclass_of($parent, 'DirectoryIterator'); } + + /** + * @param ClassNode $node + * @return boolean + */ + private function nodeIsSplFileObject(ClassNode $node) + { + $parent = $node->getParentClass(); + + return 'SplFileObject' === $parent + || is_subclass_of($parent, 'SplFileObject'); + } } diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php index 8437dc2e..56f47b11 100644 --- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php +++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php @@ -1,10 +1,4 @@ + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\PhpDocumentor; + +use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; +use phpDocumentor\Reflection\DocBlock\Tags\Method; + +/** + * @author ThĆ©o FIDRY + * + * @internal + */ +final class ClassAndInterfaceTagRetriever implements MethodTagRetrieverInterface +{ + private $classRetriever; + + public function __construct(MethodTagRetrieverInterface $classRetriever = null) + { + if (null !== $classRetriever) { + $this->classRetriever = $classRetriever; + + return; + } + + $this->classRetriever = class_exists('phpDocumentor\Reflection\DocBlockFactory') && class_exists('phpDocumentor\Reflection\Types\ContextFactory') + ? new ClassTagRetriever() + : new LegacyClassTagRetriever() + ; + } + + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[]|Method[] + */ + public function getTagList(\ReflectionClass $reflectionClass) + { + return array_merge( + $this->classRetriever->getTagList($reflectionClass), + $this->getInterfacesTagList($reflectionClass) + ); + } + + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[]|Method[] + */ + private function getInterfacesTagList(\ReflectionClass $reflectionClass) + { + $interfaces = $reflectionClass->getInterfaces(); + $tagList = array(); + + foreach($interfaces as $interface) { + $tagList = array_merge($tagList, $this->classRetriever->getTagList($interface)); + } + + return $tagList; + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php new file mode 100644 index 00000000..1d2da8f0 --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php @@ -0,0 +1,52 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\PhpDocumentor; + +use phpDocumentor\Reflection\DocBlock\Tags\Method; +use phpDocumentor\Reflection\DocBlockFactory; +use phpDocumentor\Reflection\Types\ContextFactory; + +/** + * @author ThĆ©o FIDRY + * + * @internal + */ +final class ClassTagRetriever implements MethodTagRetrieverInterface +{ + private $docBlockFactory; + private $contextFactory; + + public function __construct() + { + $this->docBlockFactory = DocBlockFactory::createInstance(); + $this->contextFactory = new ContextFactory(); + } + + /** + * @param \ReflectionClass $reflectionClass + * + * @return Method[] + */ + public function getTagList(\ReflectionClass $reflectionClass) + { + try { + $phpdoc = $this->docBlockFactory->create( + $reflectionClass, + $this->contextFactory->createFromReflector($reflectionClass) + ); + + return $phpdoc->getTagsByName('method'); + } catch (\InvalidArgumentException $e) { + return array(); + } + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php new file mode 100644 index 00000000..c0dec3de --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php @@ -0,0 +1,35 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\PhpDocumentor; + +use phpDocumentor\Reflection\DocBlock; +use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; + +/** + * @author ThĆ©o FIDRY + * + * @internal + */ +final class LegacyClassTagRetriever implements MethodTagRetrieverInterface +{ + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[] + */ + public function getTagList(\ReflectionClass $reflectionClass) + { + $phpdoc = new DocBlock($reflectionClass->getDocComment()); + + return $phpdoc->getTagsByName('method'); + } +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php new file mode 100644 index 00000000..d3989dad --- /dev/null +++ b/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php @@ -0,0 +1,30 @@ + + * Marcello Duarte + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Prophecy\PhpDocumentor; + +use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag; +use phpDocumentor\Reflection\DocBlock\Tags\Method; + +/** + * @author ThĆ©o FIDRY + * + * @internal + */ +interface MethodTagRetrieverInterface +{ + /** + * @param \ReflectionClass $reflectionClass + * + * @return LegacyMethodTag[]|Method[] + */ + public function getTagList(\ReflectionClass $reflectionClass); +} diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php index 426df322..27e80f5b 100644 --- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php +++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php @@ -86,6 +86,7 @@ public function __construct(ObjectProphecy $objectProphecy, $methodName, $argume case 'Traversable': case 'Generator': // Remove eval() when minimum version >=5.5 + /** @var callable $generator */ $generator = eval('return function () { yield; };'); return $generator(); diff --git a/vendor/phpunit/php-timer/.gitignore b/vendor/phpunit/php-timer/.gitignore index a7419836..cb465d9e 100644 --- a/vendor/phpunit/php-timer/.gitignore +++ b/vendor/phpunit/php-timer/.gitignore @@ -1,7 +1,3 @@ -build/api -build/code-browser -build/coverage -build/logs -build/pdepend -cache.properties -phpunit.xml +/vendor +/composer.lock + diff --git a/vendor/phpunit/php-timer/.travis.yml b/vendor/phpunit/php-timer/.travis.yml index 1563ea39..fd8e8500 100644 --- a/vendor/phpunit/php-timer/.travis.yml +++ b/vendor/phpunit/php-timer/.travis.yml @@ -6,10 +6,18 @@ php: - 5.4 - 5.5 - 5.6 + - 7.0 + - nightly - hhvm +before_install: + - composer self-update + +install: + - travis_retry composer install --no-interaction --prefer-source + script: - - phpunit --bootstrap src/Timer.php tests + - ./vendor/bin/phpunit --bootstrap src/Timer.php tests notifications: email: false diff --git a/vendor/phpunit/php-timer/README.md b/vendor/phpunit/php-timer/README.md index 61e2cca2..1c5b7567 100644 --- a/vendor/phpunit/php-timer/README.md +++ b/vendor/phpunit/php-timer/README.md @@ -44,4 +44,4 @@ print PHP_Timer::resourceUsage(); The code above yields the output below: - Time: 0 ms, Memory: 0.50Mb + Time: 0 ms, Memory: 0.50MB diff --git a/vendor/phpunit/php-timer/composer.json b/vendor/phpunit/php-timer/composer.json index 4adc8dbc..a327276f 100644 --- a/vendor/phpunit/php-timer/composer.json +++ b/vendor/phpunit/php-timer/composer.json @@ -21,9 +21,13 @@ "require": { "php": ">=5.3.3" }, + "require-dev": { + "phpunit/phpunit": "~4|~5" + }, "autoload": { "classmap": [ "src/" ] } } + diff --git a/vendor/phpunit/php-timer/src/Timer.php b/vendor/phpunit/php-timer/src/Timer.php index 19fec739..34df0bae 100644 --- a/vendor/phpunit/php-timer/src/Timer.php +++ b/vendor/phpunit/php-timer/src/Timer.php @@ -91,7 +91,7 @@ public static function timeSinceStartOfRequest() public static function resourceUsage() { return sprintf( - 'Time: %s, Memory: %4.2fMb', + 'Time: %s, Memory: %4.2fMB', self::timeSinceStartOfRequest(), memory_get_peak_usage(true) / 1048576 ); diff --git a/vendor/phpunit/php-timer/tests/TimerTest.php b/vendor/phpunit/php-timer/tests/TimerTest.php index 9d97d300..f18c24b0 100644 --- a/vendor/phpunit/php-timer/tests/TimerTest.php +++ b/vendor/phpunit/php-timer/tests/TimerTest.php @@ -54,7 +54,7 @@ public function testTimeSinceStartOfRequest() public function testResourceUsage() { $this->assertStringMatchesFormat( - 'Time: %s, Memory: %s', + 'Time: %s, Memory: %fMB', PHP_Timer::resourceUsage() ); } diff --git a/vendor/phpunit/phpunit/.gitattributes b/vendor/phpunit/phpunit/.gitattributes index 821227aa..300d63bd 100644 --- a/vendor/phpunit/phpunit/.gitattributes +++ b/vendor/phpunit/phpunit/.gitattributes @@ -1,3 +1,4 @@ +/build export-ignore *.php diff=php composer.json merge=ours src/Runner/Version.php merge=ours diff --git a/vendor/phpunit/phpunit/.gitignore b/vendor/phpunit/phpunit/.gitignore index 65a2321e..8caea62d 100644 --- a/vendor/phpunit/phpunit/.gitignore +++ b/vendor/phpunit/phpunit/.gitignore @@ -1,22 +1,16 @@ -build/api -build/code-browser -build/coverage -build/logs -build/pdepend -build/phar -build/phpdox -build/*.phar -build/*.phar.asc -tests/TextUI/*.diff -tests/TextUI/*.exp -tests/TextUI/*.log -tests/TextUI/*.out -tests/TextUI/*.php -/bin -/vendor +/.ant_targets +/.idea +/build/documentation +/build/logfiles +/build/phar +/build/phpdox +/build/*.phar +/build/*.phar.asc +/tests/TextUI/*.diff +/tests/TextUI/*.exp +/tests/TextUI/*.log +/tests/TextUI/*.out +/tests/TextUI/*.php +/cache.properties /composer.lock -/composer.phar -phpunit.xml -cache.properties -.idea -.ant_targets +/vendor diff --git a/vendor/phpunit/phpunit/.travis.yml b/vendor/phpunit/phpunit/.travis.yml index 3be518e1..42a96aa2 100644 --- a/vendor/phpunit/phpunit/.travis.yml +++ b/vendor/phpunit/phpunit/.travis.yml @@ -7,11 +7,13 @@ php: - 5.5 - 5.6 - 7.0 + - nightly - hhvm matrix: allow_failures: - php: 7.0 + - php: nightly - php: hhvm sudo: false @@ -25,7 +27,7 @@ install: script: - ./phpunit - ./phpunit --configuration ./build/travis-ci-fail.xml > /dev/null; if [ $? -eq 0 ]; then echo "SHOULD FAIL"; false; else echo "fail checked"; fi; - - xmllint --noout --schema phpunit.xsd phpunit.xml.dist + - xmllint --noout --schema phpunit.xsd phpunit.xml - xmllint --noout --schema phpunit.xsd tests/_files/configuration.xml - xmllint --noout --schema phpunit.xsd tests/_files/configuration_empty.xml - xmllint --noout --schema phpunit.xsd tests/_files/configuration_xinclude.xml -xinclude diff --git a/vendor/phpunit/phpunit/CONTRIBUTING.md b/vendor/phpunit/phpunit/CONTRIBUTING.md index aee139f3..3071e282 100644 --- a/vendor/phpunit/phpunit/CONTRIBUTING.md +++ b/vendor/phpunit/phpunit/CONTRIBUTING.md @@ -13,7 +13,7 @@ Please note that this project is released with a [Contributor Code of Conduct](C Please make sure that you have [set up your user name and email address](http://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) for use with Git. Strings such as `silly nick name ` look really stupid in the commit history of a project. -Pull requests for bug fixes must be based on the current stable branch whereas pull requests for new features must be based on the current alpha branch (when `5.0` is the current stable branch, then `5.1` is the current beta branch and `5.2` is the current alpha branch). +Pull requests for bug fixes must be based on the current stable branch whereas pull requests for new features must be based on the `master` branch. We are trying to keep backwards compatibility breaks in PHPUnit to an absolute minimum. Please take this into account when proposing changes. diff --git a/vendor/phpunit/phpunit/ChangeLog-4.8.md b/vendor/phpunit/phpunit/ChangeLog-4.8.md index 9d431870..b717a2a7 100644 --- a/vendor/phpunit/phpunit/ChangeLog-4.8.md +++ b/vendor/phpunit/phpunit/ChangeLog-4.8.md @@ -2,6 +2,25 @@ All notable changes of the PHPUnit 4.8 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [4.8.27] - 2016-07-21 + +### Fixed + +* Fixed [#1968](https://github.com/sebastianbergmann/phpunit/issues/1968): Invalid data sets are not handled correctly for `@testWith` annotation + +## [4.8.26] - 2016-05-17 + +### Fixed + +* Fixed [phpunit-mock-objects/#301](https://github.com/sebastianbergmann/phpunit-mock-objects/issues/301): `PHPUnit_Framework_MockObject_MockBuilder::getMock()` calls `PHPUnit_Framework_TestCase::getMock()` with more arguments than accepted + +## [4.8.25] - 2016-05-10 + +### Fixed + +* Fixed [#2112](https://github.com/sebastianbergmann/phpunit/issues/2112): Output is html entity encoded when ran through `phpdbg` +* Fixed [#2158](https://github.com/sebastianbergmann/phpunit/issues/2158): Failure to run tests in separate processes if a file included into main process contains constant definition + ## [4.8.24] - 2016-03-14 ### Fixed @@ -177,6 +196,9 @@ New PHAR release due to updated dependencies * Made the argument check of `assertContains()` and `assertNotContains()` more strict to prevent undefined behavior such as [#1808](https://github.com/sebastianbergmann/phpunit/issues/1808) * Changed the name of the default group from `__nogroup__` to `default` +[4.8.27]: https://github.com/sebastianbergmann/phpunit/compare/4.8.26...4.8.27 +[4.8.26]: https://github.com/sebastianbergmann/phpunit/compare/4.8.25...4.8.26 +[4.8.25]: https://github.com/sebastianbergmann/phpunit/compare/4.8.24...4.8.25 [4.8.24]: https://github.com/sebastianbergmann/phpunit/compare/4.8.23...4.8.24 [4.8.23]: https://github.com/sebastianbergmann/phpunit/compare/4.8.22...4.8.23 [4.8.22]: https://github.com/sebastianbergmann/phpunit/compare/4.8.21...4.8.22 diff --git a/vendor/phpunit/phpunit/build.xml b/vendor/phpunit/phpunit/build.xml index 894fc5d3..bde33322 100644 --- a/vendor/phpunit/phpunit/build.xml +++ b/vendor/phpunit/phpunit/build.xml @@ -1,95 +1,116 @@ - + + - + + + - - + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + - + + + - - + + + - - - - - + + + - - - - - + + + + - - - - + + + + + + + + + + + + + + + - - - - + + + + + + + + + - - - + + + + + - - - + + + - - - + + + - + - - + @@ -99,189 +120,253 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - + - - + + - + - + - + - + - + - - + + - + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/phpunit/phpunit/build/bin/phpab b/vendor/phpunit/phpunit/build/bin/phpab deleted file mode 100755 index 80eaec49..00000000 --- a/vendor/phpunit/phpunit/build/bin/phpab +++ /dev/null @@ -1,891 +0,0 @@ -#!/usr/bin/env php - '/vendor/zetacomponents/base/src/base.php', - 'ezcbaseconfigurationinitializer' => '/vendor/zetacomponents/base/src/interfaces/configuration_initializer.php', - 'ezcbasedoubleclassrepositoryprefixexception' => '/vendor/zetacomponents/base/src/exceptions/double_class_repository_prefix.php', - 'ezcbaseexception' => '/vendor/zetacomponents/base/src/exceptions/exception.php', - 'ezcbaseexportable' => '/vendor/zetacomponents/base/src/interfaces/exportable.php', - 'ezcbaseextensionnotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/extension_not_found.php', - 'ezcbasefeatures' => '/vendor/zetacomponents/base/src/features.php', - 'ezcbasefile' => '/vendor/zetacomponents/base/src/file.php', - 'ezcbasefileexception' => '/vendor/zetacomponents/base/src/exceptions/file_exception.php', - 'ezcbasefilefindcontext' => '/vendor/zetacomponents/base/src/structs/file_find_context.php', - 'ezcbasefileioexception' => '/vendor/zetacomponents/base/src/exceptions/file_io.php', - 'ezcbasefilenotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/file_not_found.php', - 'ezcbasefilepermissionexception' => '/vendor/zetacomponents/base/src/exceptions/file_permission.php', - 'ezcbasefunctionalitynotsupportedexception' => '/vendor/zetacomponents/base/src/exceptions/functionality_not_supported.php', - 'ezcbaseinit' => '/vendor/zetacomponents/base/src/init.php', - 'ezcbaseinitcallbackconfiguredexception' => '/vendor/zetacomponents/base/src/exceptions/init_callback_configured.php', - 'ezcbaseinitinvalidcallbackclassexception' => '/vendor/zetacomponents/base/src/exceptions/invalid_callback_class.php', - 'ezcbaseinvalidparentclassexception' => '/vendor/zetacomponents/base/src/exceptions/invalid_parent_class.php', - 'ezcbasemetadata' => '/vendor/zetacomponents/base/src/metadata.php', - 'ezcbasemetadatapearreader' => '/vendor/zetacomponents/base/src/metadata/pear.php', - 'ezcbasemetadatatarballreader' => '/vendor/zetacomponents/base/src/metadata/tarball.php', - 'ezcbaseoptions' => '/vendor/zetacomponents/base/src/options.php', - 'ezcbasepersistable' => '/vendor/zetacomponents/base/src/interfaces/persistable.php', - 'ezcbasepropertynotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/property_not_found.php', - 'ezcbasepropertypermissionexception' => '/vendor/zetacomponents/base/src/exceptions/property_permission.php', - 'ezcbaserepositorydirectory' => '/vendor/zetacomponents/base/src/structs/repository_directory.php', - 'ezcbasesettingnotfoundexception' => '/vendor/zetacomponents/base/src/exceptions/setting_not_found.php', - 'ezcbasesettingvalueexception' => '/vendor/zetacomponents/base/src/exceptions/setting_value.php', - 'ezcbasestruct' => '/vendor/zetacomponents/base/src/struct.php', - 'ezcbasevalueexception' => '/vendor/zetacomponents/base/src/exceptions/value.php', - 'ezcbasewhateverexception' => '/vendor/zetacomponents/base/src/exceptions/whatever.php', - 'ezcconsoleargument' => '/vendor/zetacomponents/console-tools/src/input/argument.php', - 'ezcconsoleargumentalreadyregisteredexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_already_registered.php', - 'ezcconsoleargumentexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument.php', - 'ezcconsoleargumentmandatoryviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_mandatory_violation.php', - 'ezcconsolearguments' => '/vendor/zetacomponents/console-tools/src/input/arguments.php', - 'ezcconsoleargumenttypeviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_type_violation.php', - 'ezcconsoledialog' => '/vendor/zetacomponents/console-tools/src/interfaces/dialog.php', - 'ezcconsoledialogabortexception' => '/vendor/zetacomponents/console-tools/src/exceptions/dialog_abort.php', - 'ezcconsoledialogoptions' => '/vendor/zetacomponents/console-tools/src/options/dialog.php', - 'ezcconsoledialogvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/dialog_validator.php', - 'ezcconsoledialogviewer' => '/vendor/zetacomponents/console-tools/src/dialog_viewer.php', - 'ezcconsoleexception' => '/vendor/zetacomponents/console-tools/src/exceptions/exception.php', - 'ezcconsoleinput' => '/vendor/zetacomponents/console-tools/src/input.php', - 'ezcconsoleinputhelpgenerator' => '/vendor/zetacomponents/console-tools/src/interfaces/input_help_generator.php', - 'ezcconsoleinputstandardhelpgenerator' => '/vendor/zetacomponents/console-tools/src/input/help_generators/standard.php', - 'ezcconsoleinputvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/input_validator.php', - 'ezcconsoleinvalidoptionnameexception' => '/vendor/zetacomponents/console-tools/src/exceptions/invalid_option_name.php', - 'ezcconsoleinvalidoutputtargetexception' => '/vendor/zetacomponents/console-tools/src/exceptions/invalid_output_target.php', - 'ezcconsolemenudialog' => '/vendor/zetacomponents/console-tools/src/dialog/menu_dialog.php', - 'ezcconsolemenudialogdefaultvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/menu_dialog_default.php', - 'ezcconsolemenudialogoptions' => '/vendor/zetacomponents/console-tools/src/options/menu_dialog.php', - 'ezcconsolemenudialogvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/menu_dialog_validator.php', - 'ezcconsolenopositionstoredexception' => '/vendor/zetacomponents/console-tools/src/exceptions/no_position_stored.php', - 'ezcconsolenovaliddialogresultexception' => '/vendor/zetacomponents/console-tools/src/exceptions/no_valid_dialog_result.php', - 'ezcconsoleoption' => '/vendor/zetacomponents/console-tools/src/input/option.php', - 'ezcconsoleoptionalreadyregisteredexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_already_registered.php', - 'ezcconsoleoptionargumentsviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_arguments_violation.php', - 'ezcconsoleoptiondependencyviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_dependency_violation.php', - 'ezcconsoleoptionexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option.php', - 'ezcconsoleoptionexclusionviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_exclusion_violation.php', - 'ezcconsoleoptionmandatoryviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_mandatory_violation.php', - 'ezcconsoleoptionmissingvalueexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_missing_value.php', - 'ezcconsoleoptionnoaliasexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_no_alias.php', - 'ezcconsoleoptionnotexistsexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_not_exists.php', - 'ezcconsoleoptionrule' => '/vendor/zetacomponents/console-tools/src/structs/option_rule.php', - 'ezcconsoleoptionstringnotwellformedexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_string_not_wellformed.php', - 'ezcconsoleoptiontoomanyvaluesexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_too_many_values.php', - 'ezcconsoleoptiontypeviolationexception' => '/vendor/zetacomponents/console-tools/src/exceptions/option_type_violation.php', - 'ezcconsoleoutput' => '/vendor/zetacomponents/console-tools/src/output.php', - 'ezcconsoleoutputformat' => '/vendor/zetacomponents/console-tools/src/structs/output_format.php', - 'ezcconsoleoutputformats' => '/vendor/zetacomponents/console-tools/src/structs/output_formats.php', - 'ezcconsoleoutputoptions' => '/vendor/zetacomponents/console-tools/src/options/output.php', - 'ezcconsoleprogressbar' => '/vendor/zetacomponents/console-tools/src/progressbar.php', - 'ezcconsoleprogressbaroptions' => '/vendor/zetacomponents/console-tools/src/options/progressbar.php', - 'ezcconsoleprogressmonitor' => '/vendor/zetacomponents/console-tools/src/progressmonitor.php', - 'ezcconsoleprogressmonitoroptions' => '/vendor/zetacomponents/console-tools/src/options/progressmonitor.php', - 'ezcconsolequestiondialog' => '/vendor/zetacomponents/console-tools/src/dialog/question_dialog.php', - 'ezcconsolequestiondialogcollectionvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_collection.php', - 'ezcconsolequestiondialogmappingvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_mapping.php', - 'ezcconsolequestiondialogoptions' => '/vendor/zetacomponents/console-tools/src/options/question_dialog.php', - 'ezcconsolequestiondialogregexvalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_regex.php', - 'ezcconsolequestiondialogtypevalidator' => '/vendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_type.php', - 'ezcconsolequestiondialogvalidator' => '/vendor/zetacomponents/console-tools/src/interfaces/question_dialog_validator.php', - 'ezcconsolestandardinputvalidator' => '/vendor/zetacomponents/console-tools/src/input/validators/standard.php', - 'ezcconsolestatusbar' => '/vendor/zetacomponents/console-tools/src/statusbar.php', - 'ezcconsolestatusbaroptions' => '/vendor/zetacomponents/console-tools/src/options/statusbar.php', - 'ezcconsolestringtool' => '/vendor/zetacomponents/console-tools/src/tools/string.php', - 'ezcconsoletable' => '/vendor/zetacomponents/console-tools/src/table.php', - 'ezcconsoletablecell' => '/vendor/zetacomponents/console-tools/src/table/cell.php', - 'ezcconsoletableoptions' => '/vendor/zetacomponents/console-tools/src/options/table.php', - 'ezcconsoletablerow' => '/vendor/zetacomponents/console-tools/src/table/row.php', - 'ezcconsoletoomanyargumentsexception' => '/vendor/zetacomponents/console-tools/src/exceptions/argument_too_many.php', - 'theseer\\autoload\\application' => '/phpab/Application.php', - 'theseer\\autoload\\applicationexception' => '/phpab/Application.php', - 'theseer\\autoload\\autoloadbuilderexception' => '/phpab/AutoloadRenderer.php', - 'theseer\\autoload\\autoloadrenderer' => '/phpab/AutoloadRenderer.php', - 'theseer\\autoload\\cache' => '/phpab/Cache.php', - 'theseer\\autoload\\cacheentry' => '/phpab/CacheEntry.php', - 'theseer\\autoload\\cacheexception' => '/phpab/Cache.php', - 'theseer\\autoload\\cachingparser' => '/phpab/CachingParser.php', - 'theseer\\autoload\\classdependencysorter' => '/phpab/DependencySorter.php', - 'theseer\\autoload\\classdependencysorterexception' => '/phpab/DependencySorter.php', - 'theseer\\autoload\\cli' => '/phpab/CLI.php', - 'theseer\\autoload\\clienvironmentexception' => '/phpab/CLI.php', - 'theseer\\autoload\\collector' => '/phpab/Collector.php', - 'theseer\\autoload\\collectorexception' => '/phpab/Collector.php', - 'theseer\\autoload\\collectorresult' => '/phpab/CollectorResult.php', - 'theseer\\autoload\\collectorresultexception' => '/phpab/CollectorResult.php', - 'theseer\\autoload\\composeriterator' => '/phpab/ComposerIterator.php', - 'theseer\\autoload\\composeriteratorexception' => '/phpab/ComposerIterator.php', - 'theseer\\autoload\\config' => '/phpab/Config.php', - 'theseer\\autoload\\factory' => '/phpab/Factory.php', - 'theseer\\autoload\\logger' => '/phpab/Logger.php', - 'theseer\\autoload\\parser' => '/phpab/Parser.php', - 'theseer\\autoload\\parseresult' => '/phpab/ParseResult.php', - 'theseer\\autoload\\parserexception' => '/phpab/Parser.php', - 'theseer\\autoload\\parserinterface' => '/phpab/ParserInterface.php', - 'theseer\\autoload\\pathcomparator' => '/phpab/PathComparator.php', - 'theseer\\autoload\\pharbuilder' => '/phpab/PharBuilder.php', - 'theseer\\autoload\\sourcefile' => '/phpab/SourceFile.php', - 'theseer\\autoload\\staticrenderer' => '/phpab/StaticRenderer.php', - 'theseer\\autoload\\version' => '/phpab/Version.php', - 'theseer\\directoryscanner\\directoryscanner' => '/vendor/theseer/directoryscanner/src/directoryscanner.php', - 'theseer\\directoryscanner\\exception' => '/vendor/theseer/directoryscanner/src/directoryscanner.php', - 'theseer\\directoryscanner\\filesonlyfilteriterator' => '/vendor/theseer/directoryscanner/src/filesonlyfilter.php', - 'theseer\\directoryscanner\\includeexcludefilteriterator' => '/vendor/theseer/directoryscanner/src/includeexcludefilter.php', - 'theseer\\directoryscanner\\phpfilteriterator' => '/vendor/theseer/directoryscanner/src/phpfilter.php' - ); - } - - $class = strtolower($class); - - if (isset($classes[$class])) { - require 'phar://phpab.phar' . $classes[$class]; - } - } -); - -Phar::mapPhar('phpab.phar'); -define('PHPAB_VERSION', '1.21.0'); -$factory = new \TheSeer\Autoload\Factory(); -$factory->getCLI()->run(); -exit(0); - -__HALT_COMPILER(); ?> -Ó) -phpab.phar8vendor/theseer/directoryscanner/src/directoryscanner.php«"\BVA éP…¶7vendor/theseer/directoryscanner/src/filesonlyfilter.php“ -\BVŖAśf„¶<vendor/theseer/directoryscanner/src/includeexcludefilter.php^\BVT†BŲl¶1vendor/theseer/directoryscanner/src/phpfilter.php× \BV„šFA¶'vendor/zetacomponents/base/src/base.phpŪY\BVŽū\”¶0vendor/zetacomponents/base/src/base_autoload.phpN\BVHŖ“Ā¬¶Lvendor/zetacomponents/base/src/exceptions/double_class_repository_prefix.phpV\BV6åŽw¶7vendor/zetacomponents/base/src/exceptions/exception.phpŖ\BV CTsļ¶Avendor/zetacomponents/base/src/exceptions/extension_not_found.php6\BV~²9 ¶<vendor/zetacomponents/base/src/exceptions/file_exception.php-\BVŽ®¹¶5vendor/zetacomponents/base/src/exceptions/file_io.phpÕ\BV™O¶Ķ;¶<vendor/zetacomponents/base/src/exceptions/file_not_found.phpJ\BV,T]DX¶=vendor/zetacomponents/base/src/exceptions/file_permission.phpŖ \BVīDķg7¶Ivendor/zetacomponents/base/src/exceptions/functionality_not_supported.php>\BV× V&J¶Fvendor/zetacomponents/base/src/exceptions/init_callback_configured.phpÆ\BVó: äė¶Dvendor/zetacomponents/base/src/exceptions/invalid_callback_class.php_\BV -ZĀ»¶Bvendor/zetacomponents/base/src/exceptions/invalid_parent_class.phpE\BVßīå‡å¶@vendor/zetacomponents/base/src/exceptions/property_not_found.phpł\BVŃ"ķyA¶Avendor/zetacomponents/base/src/exceptions/property_permission.phpf\BVW>ĀD¢¶?vendor/zetacomponents/base/src/exceptions/setting_not_found.phpT\BVńH[Yé¶;vendor/zetacomponents/base/src/exceptions/setting_value.php[\BVŗĶį¶3vendor/zetacomponents/base/src/exceptions/value.phpĘ\BVÓś«.Ѷ6vendor/zetacomponents/base/src/exceptions/whatever.php \BVĪ8±K¶0vendor/zetacomponents/base/src/ezc_bootstrap.php|\BV¬M‡€É¶+vendor/zetacomponents/base/src/features.php„.\BVĒ -'å‚ę¶'vendor/zetacomponents/base/src/file.php_H\BVŽłą ^¶'vendor/zetacomponents/base/src/init.phpV\BVukoä¶Gvendor/zetacomponents/base/src/interfaces/configuration_initializer.php‹\BVŖE”¶8vendor/zetacomponents/base/src/interfaces/exportable.php§\BVBś©ō5¶9vendor/zetacomponents/base/src/interfaces/persistable.phpū\BV9­J ¶+vendor/zetacomponents/base/src/metadata.phpæ\BV¼Ÿģb•¶0vendor/zetacomponents/base/src/metadata/pear.php\BV·ų<£·¶3vendor/zetacomponents/base/src/metadata/tarball.php\BVż” g^¶*vendor/zetacomponents/base/src/options.phpš\BV±y*Ll¶)vendor/zetacomponents/base/src/struct.php?\BV“t¢æŖ¶<vendor/zetacomponents/base/src/structs/file_find_context.phpµ \BVż-ŻŃš¶?vendor/zetacomponents/base/src/structs/repository_directory.php \BVL”8'U¶<vendor/zetacomponents/console-tools/src/console_autoload.phpr\BVÆć§i¶>vendor/zetacomponents/console-tools/src/dialog/menu_dialog.phpę\BV1„wĒŌ¶Bvendor/zetacomponents/console-tools/src/dialog/question_dialog.phpū"\BVŸ †Ćt˜¶Qvendor/zetacomponents/console-tools/src/dialog/validators/menu_dialog_default.php…\BV+ø¶Xvendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_collection.phpą\BV€O›žN¶Uvendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_mapping.php\BVÅ­ĆF¶Svendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_regex.phpŹ\BVÓ»ų{¶Rvendor/zetacomponents/console-tools/src/dialog/validators/question_dialog_type.phpC\BV(—¶9vendor/zetacomponents/console-tools/src/dialog_viewer.php" -\BV?R28¾¶?vendor/zetacomponents/console-tools/src/exceptions/argument.phpŠ\BVŗX’ Ī¶Rvendor/zetacomponents/console-tools/src/exceptions/argument_already_registered.phpE \BV¼/wm'¶Svendor/zetacomponents/console-tools/src/exceptions/argument_mandatory_violation.php…\BV “š±¶Hvendor/zetacomponents/console-tools/src/exceptions/argument_too_many.php¶\BV*YĒŪ¶Nvendor/zetacomponents/console-tools/src/exceptions/argument_type_violation.phps\BVu[Ó:M¶Cvendor/zetacomponents/console-tools/src/exceptions/dialog_abort.php·\BVŽ"¶¶@vendor/zetacomponents/console-tools/src/exceptions/exception.php¬\BVP[„ ¶Jvendor/zetacomponents/console-tools/src/exceptions/invalid_option_name.php\BV÷dõ¶Lvendor/zetacomponents/console-tools/src/exceptions/invalid_output_target.phpļ\BVå]vmw¶Ivendor/zetacomponents/console-tools/src/exceptions/no_position_stored.php¬\BV°½RGy¶Mvendor/zetacomponents/console-tools/src/exceptions/no_valid_dialog_result.phpÄ\BVŁXŠż¶=vendor/zetacomponents/console-tools/src/exceptions/option.php\BVµ}ŽžY¶Pvendor/zetacomponents/console-tools/src/exceptions/option_already_registered.phpé\BVŁ-/߶Qvendor/zetacomponents/console-tools/src/exceptions/option_arguments_violation.phpŸ\BV~xķ¶Rvendor/zetacomponents/console-tools/src/exceptions/option_dependency_violation.php\BVr„ŗ¶¶Qvendor/zetacomponents/console-tools/src/exceptions/option_exclusion_violation.php\BVhV‡m¶Qvendor/zetacomponents/console-tools/src/exceptions/option_mandatory_violation.phph\BVžYXpA¶Kvendor/zetacomponents/console-tools/src/exceptions/option_missing_value.php†\BVFø^¶Fvendor/zetacomponents/console-tools/src/exceptions/option_no_alias.php \BVńŠ££¶Hvendor/zetacomponents/console-tools/src/exceptions/option_not_exists.php$\BVų6E“¶Svendor/zetacomponents/console-tools/src/exceptions/option_string_not_wellformed.php \BVäŁ0‘õ¶Mvendor/zetacomponents/console-tools/src/exceptions/option_too_many_values.phpw\BVžˆ•¶Lvendor/zetacomponents/console-tools/src/exceptions/option_type_violation.php\BV†ąD/¶1vendor/zetacomponents/console-tools/src/input.phpK³\BVč&}hź¶:vendor/zetacomponents/console-tools/src/input/argument.phpģ\BV©h"Į¶;vendor/zetacomponents/console-tools/src/input/arguments.phpb!\BVåJES¶Jvendor/zetacomponents/console-tools/src/input/help_generators/standard.php9\BVčBƒj¶8vendor/zetacomponents/console-tools/src/input/option.phpæO\BVS•Ē~°¶Evendor/zetacomponents/console-tools/src/input/validators/standard.phpß\BV xē¶=vendor/zetacomponents/console-tools/src/interfaces/dialog.phpT \BV*/Z;¶Gvendor/zetacomponents/console-tools/src/interfaces/dialog_validator.php­\BVŠ ˜‘5¶Kvendor/zetacomponents/console-tools/src/interfaces/input_help_generator.php\BVtžŚÓ¶Fvendor/zetacomponents/console-tools/src/interfaces/input_validator.phpy\BVeutov¶Lvendor/zetacomponents/console-tools/src/interfaces/menu_dialog_validator.phpŠ\BV±÷åT¶Pvendor/zetacomponents/console-tools/src/interfaces/question_dialog_validator.php\BVķŖ&cÖ¶:vendor/zetacomponents/console-tools/src/options/dialog.php2 \BV3óY¶?vendor/zetacomponents/console-tools/src/options/menu_dialog.php‰\BV1vžf¶:vendor/zetacomponents/console-tools/src/options/output.phpƒ\BV¦0ŁI¶?vendor/zetacomponents/console-tools/src/options/progressbar.phpē\BVt‚eÖ%¶Cvendor/zetacomponents/console-tools/src/options/progressmonitor.phpF \BVĻ ¶Cvendor/zetacomponents/console-tools/src/options/question_dialog.phpń\BVW¬ia¶=vendor/zetacomponents/console-tools/src/options/statusbar.php„ \BVpŲ~[¶9vendor/zetacomponents/console-tools/src/options/table.phpL"\BVseKÕ¶2vendor/zetacomponents/console-tools/src/output.php½M\BVźW±?¶7vendor/zetacomponents/console-tools/src/progressbar.php®:\BVdm|Ćė¶;vendor/zetacomponents/console-tools/src/progressmonitor.phpZ\BVꮦq¶5vendor/zetacomponents/console-tools/src/statusbar.php \BVj ńrM¶?vendor/zetacomponents/console-tools/src/structs/option_rule.phpĮ\BV øė¶Avendor/zetacomponents/console-tools/src/structs/output_format.phpk\BVhń+-ī¶Bvendor/zetacomponents/console-tools/src/structs/output_formats.php+\BVłD§Œż¶1vendor/zetacomponents/console-tools/src/table.php)s\BVŗsB…1¶6vendor/zetacomponents/console-tools/src/table/cell.php\BV+(Ōæņ¶5vendor/zetacomponents/console-tools/src/table/row.phpw/\BV½ -h%Ś¶8vendor/zetacomponents/console-tools/src/tools/string.phpģ\BV’Ÿ€F)¶phpab/Application.phpŽ \BVa -K䛶phpab/AutoloadRenderer.phpb#\BV³ -Bµé"¶ phpab/CLI.php’Y\BV'ŹŽ¶phpab/Cache.php@\BVä "9ū¶phpab/CacheEntry.php‘\BVß»ĮŠ¶phpab/CachingParser.phpÆ\BVPI!÷¶phpab/Collector.phpe \BV*gL®q¶phpab/CollectorResult.php -\BVé8[ ¶phpab/ComposerIterator.phpy\BVéRĀŅć¶phpab/Config.php/0\BVk å ŸĆ¶phpab/DependencySorter.phpm\BVo0&_¶phpab/Factory.php;\BV+“Ō¶phpab/Logger.php·\BV!ņ¶phpab/ParseResult.phpg\BVW–ßŖ¶phpab/Parser.php C\BV -żlPĮ¶phpab/ParserInterface.php\BV鏚¶phpab/PathComparator.phpf\BVłha¶phpab/PharBuilder.phpw\BVDšLB¶phpab/SourceFile.phpÖ\BVžā»%—¶phpab/StaticRenderer.phpŚ\BV÷Ąčš,¶phpab/Version.phpī -\BVÆ?¶"phpab/templates/ci/default.php.tpl\BV/]i¶phpab/templates/ci/phar.php.tpl¶\BVė~š¦¶ phpab/templates/ci/php52.php.tpl×\BV ^@ŽN¶"phpab/templates/cs/default.php.tplä\BV’Bw#«¶phpab/templates/cs/phar.php.tplš\BVÜĻ2q$¶ phpab/templates/cs/php52.php.tplæ\BV’&äNĖ¶phpab/templates/static.php.tpl˜\BVpķœŗ›¶"phpab/templates/staticphar.php.tplW\BVTŅ.śÖ¶ŻYįsŚŹ’īæbėÉk CL^¦_j?æ[!QIŲń4F «£¶™6żŪ»{:‹&Ɲ)ģ“nwo»{»{§_~[<,NŚļŽĄ;čċUĢRhLššńƇ?æ’ųįē?–D®B/zäI*ąŸ?óē3Ÿ’JÜZ‚äpĮ“'īŸį{š²¹ˆ4 ĘĖ4ˆ#š"–‚Cˆ—É„Ė7ć ņ’Lćd.Zš¤'ņ¼LaūĮ4˜x$ E2½„Ć‚'ó M¹‹$~ -|¤^Š8Ź Ćų9ˆf0‰#? >!™ę<=WzĮŽnāi®Ō$ö‘z)RēzØ,‰õĘńM喊ā4˜šV& $¢@’S\8ņKZįŖ“Š ę<9;  ®Z°K® ¢õ—Øįļ¤(¬~³;7ųØ]é†īŽĖU{ŗkŅŠ=\Rƒf»zghh6I ķå0 ˆ]ŻéšŽgŻ3T×vĖLœĶ0*#ˆ"\xÅPYķŹ`Łrø«Ū¬ć²Ķ؃vD%8ÖŃiĄ¾0D¤Ł÷!ņ¢d‡żeˆt8]­Æ]#ĘFÉ@%ė“:C›õIq«G¢œį•ćźīŠepmY]iy‡Ł·z‡9`XŽ4ÜŠa-\ÄÕZ4RŠj8ć«”£“żH–nŗĢ¶‡W·Ģ&į-„šjČŻ•¶¶L‰eŁ÷$—Œ!]т»†ļŃķ¦LÅd8Ģį ;n‘WE{ŗ°`²kCæff‡Ń¬E‚īt‡5ehŁŗC4z¶ų†+ ¾tź– įܒ®½Z÷V'å3bh]…¾u†eż|g|Zx“GoĘi[uƒ„OpÓ®œ‰E<‘óŽ÷Z"·]½Źņi“Żjp“öU"ųbfŒ„ŌģŹé‚‘=Ŗ©č²ßCš.ĪŪķ¦„åųlĻŪ˜‹ēI»NūäDf)ĶĮ}ąŅ}-ÓĮ?NNH²¬³ żd™ĢJ  &x˜!%¼f8e+‘ņ9,>ģ—Hō~5†åÓ L—Ń$kr}_ĻōiŠ*M M(üŽPņžW„ņ_’†‰ģbMōm/~ĮÓ-ø¹jĄ–”’”Ī†{e1™iöFܱv@m•DĆŪ,æŽĆƆ9Ā,34‹—ƒĀhM°s-ƒ{ Ձ­T‚5+Ą*CPĀ¶‘TBØ0ķ¾†Üe±ĮȅŠ[/ üq™š~éC?ĖĀ^&|AK4Nõč‰Xøņ~—ū§­ Ķł¹¢!ńĶ‹-±ßŖœ•oŚ­Ēf›y ÷^ąĖč’ śį_»Ųóa)lÕĪĒ1Ö; šģ@ę¬ęŌ‘ģWĻ€OƘ2‡ŲŠ(ćA{cȬYųŚ[·yĀ>?ļY†aŻœū¾”›ŸļŻŽ½-%U®,‘Ąå%`łąU~TvĶ££ž’Ūč—”ŖįĪM¹Ņ~¶-ÖĀ³')`ĆBĒה ugĢpośVn”(©å–@”¼²'G5Jq[ 5ł«aėģ-ęyĆrD1G–ßƘ³UĢq•=5K©œs|8¦˜—zó#Š9”^ó²˜_Ģ•ÖŜ–­˜ošĻŗf©,ęÕē—½ØŽ*ękX‡‹¹R”6„hƒB,BŚ3Öųļœī¤ä]TvĢ“g»¹—N(Œ1ŠbTūŠ® ~kKĄ)[ž4Āmń'°Õ§ļŌ d}8„säįŠn×¢8­cųd=šĘ p×õ‡L/ ©~«ØPu„@Q<ŚēšPŽÉCžéØqS kW|<1„ÉŖ²į2jwÉ”z’‡ rŌ –¾7CŃSüH×ŖāņV“®Éci9ŗ”UPŽcƒņČ7§.AZ -T«(ÖĒCōĢK)¤ŪQbS­“ĻŸ‚ó"}½,,#īæl_+“ŪY£Qf榑µ½żOGKŒŁ¶÷ó£ō꟧„Ö#C–ņE1?|_RųQāÆŗH6įbÓ]æ’:` åįĢ;ā/HUV©j–z+™Ž‚sś>AÅemŸĢ›įeä<8Čøq*Ņ łÓĄ„Ōäėśī%G¾¶Ą'ż¶yvīkŖ™ä²Źž…Ž°’¶¹ó¶ŒxˆyėU`»ŗež9Ų§««²L„:‚«āŻ“Ska’BÖ+ -W„I„J³¬»’/Ołż fŚe”6¶ĻóMų­|Wq® -ŠŪwo›Ä®;É­–¢ÄēŒÆśņ`}kVhūĖgćźtD£LUIŌRzļų«²Éļ m›™īHsFĶ½1µ>kĶŁÓ ¦›=ėxN‡½#¹śV—śšó¹&ßgv’ S\„ģ®Ņ‘鈵ŽEe²»ŃŚŽfw„2jr:ŸõĮØk¹uµšśi=g‹¾¹[ æķ|Ł¹Ń_§×ģŹ_Ńåä’óoÅÆUłKŹ#_Ą×Ķ«ż_&X’ ŁĶyxŹ”fą4R•ätóĶ~_‘Uė|Ę«KØ yiĀÄłóž«õ.Łšź3Iį֌¾ dÜÕEI{sćtø™¬§gįś Użx‘‡É·“µVaoŪ6żī_q(VŌ.ܤ+öeiŃE–č˜€,y¢”4@‘č˜ˆ,¤”,ņßwGɋę¦KlK¼»wļGśe·ŁŽß¾Į[šėŻ½ŃכĘł>¼’ó»ļü Ļ2ĮI?ĀāQŹ’$[„<Ž&(Ā*„L=ŒœÖqäjF±āä’pI ·SøX0\ĒmÜ(&į<’C €~:ōĬØg:("vņ3łŒ¬1]pĮ&®µ.ȇwÉ/<ĢœQłnӐ[÷8hē©ŪZąsš‚sNä;g×ØļŪWEę/zõ÷'ćt'óy­čXŚØķ½ČeU)ćģ²Å³fܱ{ŁĶrś8Ż^1żŽM§%NĘŹ:f3@Ų½¢éx4r³©+H7J(e¾’‡?F# -u·%øY6×%@Ž²”™UƒĢsµĆa[ĮZ—8¼Üȑ8 {,Š½s±Gś·ŖōQ’‰2=Ö­24įč-Q„’VĄė~ńuļuģ¾ńž°–ŠW6®ŹūŌļ82 _Ö{łž&į“2.Jį†zÓ/į»rWŚšz#ƒ®ņ²-Ō„.Œ¼5/,y‹>čH«tż <‡A§xµ·/Łŗʊ«éųÆē]{…ė¶Ź»Ÿ/n‹Ē,‹wH¾’@÷Ė»Ļ=“ńäŻēkÕ¤÷;5žF8)QfxC½ņęä 3}zŠiÕĒo¾ƒXźźę9Dm£Äc£d¹“ĶwøÆŠB‡łO^’æPkŁ–Ķ3¹×ų£įŁrßŗŽĮÆ‡ŃŸµV]o›H}÷ÆøŖZÉ®hŅ­öe›¦ ćx$ ^ĄI#õe ćÕk€¤ŃŖ’}Ļ PS'm“Uk)ę~{ī™ūīļŻz78~łr@/É)vw*»^W4LFōęõėæ^½yżĒŸd«\Ņx#ņORU%½ų>[vßG©|Æ­ķĶ†ŒuIJ–RŻČōėZŹ4++•-ė*+ryJu))Ė©,j•H³²Ģr”īhUØmiŃmV­©PęYŌm‹4[e‰Š,ķS(I;©¶YUɔvŖøÉR¼TkQįŸ„ŸĶ¦øĶņkJŠ<Ķ“]iŒ¶²zŪā¢{ŲJ*VؤH”]—ņ©Ąj·bYÜhQĒT^TY"­ĘA%+i‡ŚO?pž BŌd#²­TG?@ƒØ=^:4Č6­š7¢6דHź­Ģ+Czē†ĒØKE[QI•‰M¹/€)œ±ī%ŅOї™±Õ:¹ŲJ ģ Ćņb/.[ąÆB•­ø£„Ō„L -’y -”Ō=,Ū¢’ŌŠ)@¢iAĆHY¬Ŗ[tCē¬k³r'Żg°Ķt÷)Ż^yÓheŁĖ$žņˆ¢`_Ś!#¼ĻĆą‚»Ģ„ń„Œœ`~ņóiLÓĄsY‘ķ»Xõ搏q€…gvĖgfó@fūWÄ>ĢCE„ÄgsĆ„¶sYÄ}Ē[øÜ?·> ›ALŸńšq`5ŠŲĘLhĘBgŠO{Ģ=_™Øū:ā!mšŪaĢ…g‡ŚÓ|Īƒˆ‘NŃå‘ćŁ|ĘÜ#Ą@\bĢ)šŚž÷`ĘH¢Ÿ®v8fk=քCĀ.™ėĢöoxHĻ¢hĪ®_Ų†ŒģšŹd[xŽŲ? čAN®=³Ļ‘暀 vt‘œEČfx0Ń®¢Å8Šy¼ˆk˜XxĮD†øEÄ,‰mKĖį¬AŒ÷ń"āš?ķ‹ū1 ĆÅ<ę? —`HmX»†ėĄ79ƒ¬ ¼Ņ~5¦]NÖQvߌ8[Ӂ@'īk"*ųŒ{ɒĻĪ=~Ī|‡ii ]ņˆLk…<Ņ:¼ ~i#ņB§oŠlĶkƝ-SZā²Ż ®Į7Ź¦%ĄoŪ«ŃĀ™¶ģw;ćl'’OāZźmåfJ&Ų“wQ"ņ\*#5öš2Ūīq7ĖŁžt{„…õ½›ˆĪ68óŅ G.yĶ'DĒƒ9k]R¼–‘”źć!xśw0Š¦ę¶$s–M² @Ž?Qé3« ‘$rW–¶%-…>œpćey²©Sy,?›gļ n=uŸJNkõKj}ŻH„:żŹD -oéE»ų¢Õ:6O\eI¼É5©0"?ćųLKśx°ŽRł M|ƽ«VĘ@_{{T®%€ļŽdÕ1×cÆĆ/HPā®·züõwB…Ŗ¢,Ļ[·'OŅšCiŻ~J$«fHŗk&ÜłJ_NĶ ŠŌ!æĮ“JlT†‚öiv^Ś¬H_ßłõw“ĆPTCė¦ČŅ‡Ó«—Ųo“ŖóÄL}„¬ŚVŠ}ōÓķp4BOPļ÷\ßÓÆŽw NśÉW•/’“Ŗ®€O¦ -†{Ŗ:/æŖv;uTéč?£ŖujŌCÕĮ¦œIœ=f˜J1ĮÓķZšQ 2Œ•ZŠ–£ļD³šŌJaP$°¼…õŖ;Bɲ(pÄäb„9Z‡÷²GÖf<ķ˜hį GÆŽ_ĖjŽŹ‡£ŽžŅ?lh)’õš€?QŅsĢ‚‡qō/[Ńp•cźÕVŠ±öŃļU„ūµ™®0%Ė“{_ß~ż`·4Ą,’)¾,¼JÕOE÷pb­_’µVmoŪ6žī_q(ZŌ”—ż²¶É"K“M@–~wöÓ{²«RŅ“HŹ/²jjś”`¹>ģO2y”­ķ¢ c]S%kYŻĖģēZŹ,ƛ*_·M®JJŹŒŚZR^R­Ś*•ęd—IõHUķj‹ņfKŖ2_Õ6“SY¾ÉÓDX3©$ķeµĖ›Ff“ÆŌ}žaŃl“$pŠB=äå„ŖĢrmW£l>ōqŃ_b«ImA„*ƒv[7ȧI¬†MÖź^‹L•ŖÉSiuh•¼¦€gčøĢžEÆi‘ä;YüC4š:ąå ²ĶZDų?D}®™JŪ,Cś†§ø…ŠvI#«<)ź§ 0g¬‰ SōenlµN™ģ¤ģY…•źI\÷wXŖŖģ’GZK]HČD‘,3„®IJS¤Ž&ąeåH:FjµiP °C™Õ{™ź:ƒm®«ÆŅåUv…V׃L¢$‚Ytm‡Œ°^…Įw™KÓ9Įź&äóED‹ĄsY(Čö]œśQȧqąą•-`łŹ<Čl’†ŲēUȄ  $¾\yxpŚ~갈ūŽ»ÜŸ[ Ćf‘Ē—<‚fX]hģc -f“d”³ĄÖžrG7ĘėŒG¾ö8ƒK›Vvq'öģP#­āpF:E— Ē³ł’¹'~‰]1?"±°=ļŌ‘Ä0] 8e֞z¬s‡„]2'Ņ™=­šˆ =‹ÄŠ9\/Ųg†ŒģšĘd[ ök =Čɵ—ö9ŽŸōŒ}IN²„<˜i(OEÄ£8b4×0/XxÅ&>’C\,˜'‘mi9PĄÄXOcĮ5‹ū ĆxńĄŸ€„k0„HmX»†ėĄ79ƒ¬ ¼Ńøš s]/Īqķ¾iŚ8[Ó!@  5į|FƒdÉgsĻ™ļ0- 4Š5lbJ+äBėšĪłµ Ļ±Nß\bė–ƒr¶ĢÕŸ‘ķ^q|§lJŒš¾|p*bgŃ³x—ū$ż’ÜIż¬l¼ŲB%™9OZ¼±Ź<·›(—O]ķ,¬æ›@tY #–µ‰h*\ņŗ-D§£‘é1YR“•BŹźÖĶ+™¢Ó<Š4)KtŖßG#mj¦$™6Ė 4>Žß¤Ń½JQ’¦r&[„‘z˜!›¼@['ŗIaņé>††ŚĆŠž-3½ÕĀNu/+ŻŻō.”…D¼čMų¦×:5_Ģˆŗ¦ÕbõŒł™e5Ż>;ļÉūŽĄI\J`Zy†ŒŃū°•fP@†”¦y™m&‡ zL¤mUUŹ¹ƒõ©zĶ”Ń%z[a“*…\ĖčōĻõ¾]£lhӖi÷O‹¹ąń Ńąēõ&/7ŠĪ©”tk6ć÷÷gĮoK“ĖÉĒļō{Ļ{U;ėć ]&ć×z2_ōŁŒ'Ēw²Y%ĶV—čx2±čm–Oæ£ĄŽNčüüœĪžŠæuDćómōķž5Čąē(Č².ŒĀoĀ±Œ39yBƒNĮž¹N¦ł*H„x,ćI‡I,Z'×ÆŪ¾ŹT$±ÄŁI*ęIŹ+„įh™ĆCĮ,•r.ć<ė -q-%æø¼9?ķ‹) ‡ó'aĘóU˜ßĀ˜0«$ż"¦*˜LB\:ˆDĆsB'¦r¤¤lœ,Öi8»ĶE²ŠešŻ† XļI¹~­‘É°^h]'KEŠEµbFG¼@HņóīO¢pRC=m“_Šģy°q’‹e& čB~ĖEčbóEń˜f+źĢ€ćG$””D@¤ˆdjAŽ³ń’BÜęłā°×[­VŻ€ī&鬧Iģ½Ī^\÷i=ē]É,nżĻ2LĒ£µ€Õ8®Q°B ’ H‹U -gœi%°ÅT0M£¤Ū€mÉØqr-ĪÆāדėóėŽųp~ó×Ėw7āĆÉ`prqsŽæ—qzyqv~s~yß^‹“‹8óoēg!e°”üŗH‘Ą4DŽŹ‰„OŌ%§l!Ēį4yńlĢ¤˜%w2„m°é<ĢP“ 9õ˜‡9)U†S+“é]ņ °ū ‚Ā D?Ü) éõŠśØy0ėõ葮»‹k“žȞŽÕÅö%Všī"|ē2æM&™ˆA’,KVKPČßHaĆāN| =sŠNZ”Pįå•-yņĒŠKAčį4m Jc"Ų×HA„B¼č ļnqõ×+o4ĆŅ]¢G’‚EÉrqÖæĀ a’æn€W %āH4ĢŒĘ‹'ß¼¼¢{Óāļū½“ķYųL‚-,ŒEšL–c²™ód"= ß^žõ‡WƒĖ³w§7 ś§Ķ 'ņNFɾęY’}’ĶåÕŪžÅ }VzOĄŒóh-ĀĄęø#bxFj›ŽU5!JP+4wŲ{ -†÷Ė] -ÜüńĢĮi‘†wAŽ³`{Å^ŽŅ ]æܑ‘D‡§ģ²ń2M‘`ōø{ó$]wÉp|‹–g‰”cŽž ÅY e2GŁ7ĘK bŽx, -ŸŒĪ™Ę艗QT%Šž0_•ƒÕL-ØŁP‡1šXŚÅ€I-†”Ģ±²ivÅyŽĢ”\ųy½ÅDNƒe”w4ø‘hYĄK`qš h_”Q…łœMBv7²2]ĘJ2MĖŹ[%äÕ/£8€© 3„ø†æ莣Ź“É‚æa×khzGĖ\#:p]ŃPµr9G*÷R¹H²ålĪD”$_ąæį£lAšė–ˆ‘Œģ2’L»KŠ@ĆĹF–³•Óš+¬%ń¬5)…0Ņ¢f¹(š"œ¢6܅­üć Š,Ą›S„10“Zķłś˜ƒž’÷~ęr†śŚUH.ÆŖL#ėäŃ1}koŃĶߎŒ¶o›G`•‚’Œå ō°ūŅ^nš&sw@.?  -–+WßųEN:8$¢4•e2Ń”o˜1Ąčē·1@#qB‚’aōŪZž1Å a˜JĆ 9S(öeĘödWF].(RÓĮ^%”©¢„F؉> - m˜öS]õ$Ė’qädLƒ˜ż@Œ•³(p~TAĢ52š\M^Ł‹Żrń"8‘˜Ć pdjZk8Įģē@’”5,’ńń}U/Q{PöFié³šķ ŅyĢ!9ē„ÅüR²§Ę¬!—8LõĢ—):łt Į®1=bDUDŪƒ£Ī1FÉl=1„‘Ŗ?ŠaåL“0R]Ntʛ``³ŗM4ØiśMźŒä“käÄŚ īŽPDWŠŁÆIv9»ÕäņVŖebÅ(I"wC°l•¤ˆ5³[6eY*Ł‚B\™ ĄģdOœR¬ žņ(ƒ7‚»9W=Y ņ0’™;ŽŁźpąqZ¼3‡ąĆ†ņ+d|™c§@ŖdśŚ -}—…ćy†q(¤óObŠd¢¹Œq6šĆę+gaQ³Ī§—Ļā舕ÉZŗŗ<~”thš ēé½óĶ,Ŗ}ünxŲ±–CÅ/V»’ĪR³””­ō»…Ē‰Öo“œˆ½ėż/ŠŗÆÖ/‹|;^żE’+vDĘFŹuł&P‘מż6ȍyœBĢ•SšĖFĀ‰5=Č$d‹фœjŅ,ą+ īa0pAfÕņɎ˜ „ ēølK4z’ŻśüžÓĮ|Žo·>üö¹ųžŖņCÆŃqTlo®Šo‹§‘ŗāܳ£mĢ'/ŹZw2z‚Ź~zŽ†żDŃīĄ v©Œ…-‘…æĖdŚ²Ū¦acŒFžrXł]”TŌ¾×CMBĖ¶¾e"Į/į÷•LŪh“>=’|?,¾ż ßlČ Ń~į‡nÄūé3öbžīĪT5EŽĪlæ\?=ū\į`='õĒ»iģĻ}³G`&æPz› @µæxÖ}ā—ÜĻ;Iī{Źķ’%õ8I=ßAR–SӞŃü7” ¢ģĖvõm°Qy0åp$¦šŻŹJżffTĄ©@Ō@8`žź³S”Wvęŗ{Tt;²ąXÕ²n!ģž%é=`@tÅóšOŃRlwN2µƒī47E@§8āQ2Ž’–Ž)¤…SfĒm°XČ8£D3Ņq ļéT’h y«žÉ@ƹ÷¼©R³Elē÷%–öeą0„ʁŚ=Ćŗ]—ˆü§Ģ-fóĮ…sŠØ>{ŗČ}„śŽÖ¼%†Ć×ēośĆ”c1MT]`k«a–äģõ±MÕē{I?Ś¦Ą`ü{÷īń~¼<ŸUzžäA:±īŽ™ęWŅ„n’×x" ¤žń»­µ}”ūšĶlź€Õ|”5 Ķ¤ŒŠ `…‚©§vī¦ŚØ¶Ś2ćĆ «ąęŌ­»5“­‚3Ł[­Ó‹Š]œ: ”ĻMq`ć-N96Õż`>„b.ńÖ‘„)Ä®•źˆe”ĮēŅ-˜Śpwµ+nŖ¹^ŠAĮe«c2Ö³š«a¬†[•ü ©K‰/ŸŽjLŲŲ*{Œ?ź²T[L™AÜbƒÄ„°7hL¹§­|7ŒĆ¶PʆO - 8Š>åŠcÆ#@WĻŠ`XYšĘ€\}©Œ¦yv„1!@hb@ćĀµŁē€­/v؃%“ 0J%'B)Ģ†źˆ’µ„Ķå>µāö‚0ķd¢lMŃ¾‹XŖ?)P*Ś[ŪŲśŌUUżi8—鬾šZą]5u5Ѧq“ž°„IFž>µk]Ķž‰,÷zĶŽS©÷$kžD Õ/ ŸØŠ†0b—;5ĄŽŽyo>8d]t=U*‰D’Z>%¬ p†wtŽFbržNƒ±ÜiōFV¹HµĮŃü Tö{5lŪĢ:ü<¤Ųļ,ž¹®†ƒŅ]żµś‹Œ2¹£V=žœb;µe…bØFBär‚Ŗś!U“oĢ*FN ;ē|)ƒH›0b»Ė3µbp±} -śJ=ø”ŠŸ®”e>¦“ē4 ŽŒ“Kū²Ų|½-6xŽh3UĒą~s]h½ä°6Œ«l­"åųCȧ¦å°&ŃüĢa.ü·ˆ©¶Ūsćj*õ~3łYˆe§ōPd^Tk{ æ.ƈĪoŁSū† d¶Œr=ĘōĖ`Æųz -o¦Ŗż9C>AÄV ŠŽžMx[ł:w9öĶĒųšź?¦ĖŽŗP†ź±™īø£]ą ­åJ\ńą`ŲØöōa¼«b}P–‚ -ž…5ł¶tĶ ->sāwŹåšD<>>©§ć;Ē)ųŁv$Z³x‡oŠ]œÕ¾łLŅ}c½ų~'S‘`«ŚŒ{>ÄįA«ąŚ.e“7ŲfŚ1ʤŻ±zMh/Äŗ×d%©1 6E¹—Ń4)6zY:ī5Š÷„q&Ӝ6‘9n¹’ŠjĻżŗ±åc[ŅUød;Ŗ³źsßR$yL•"‚­EȤYØĪ†Ū˜Ō}]D°&ĘoMU0ķˆē>żaRŽLü÷»`mįį!„žļŖeŒc0ĶU…nˆwĻĄõ‡ći¦?ĒŠ’ü§żŪ;0Ż7`5š;[„ļAÓcEšMA¦qųL@ŗ€Ÿw&@¹Å‡ Zczź•Œźhž`2{ŒVoé²@ˆ ŃŗŪFUgō÷¬S āVœ€­¦V¢ĢĮ†b­Š±6Ļ/—ņšćHõŪ¦ €Wö° Ź -ļ¹ >J“/rcčR9·A掄īœYg7>Ŗ»54?Ņµp' pĆōJ¹6’®Āuó~—įÉ vÕ„Ē)Ķ®2ŪY<Ōī–¹wv°Ž L°īēŠõ/sń'+ …/ZčŹŒŗįł¶JcĻئ°ž*–„1˜éipÅŻ!.CZw‰h—kē  ŲĢ6Ćė|\²wDK®]jXZ£$UG…Ł8 ńŽąT]ķ1ŠU²Ģg’ÕNŅRµ[ÓRz‘ŽKŽś}~tEW ż§‹Ä”3ƒ\ĖZ±Ć t“ś@†Łµ1pįƚŹEÆŖyęžV!ļ§–AagÆ[>łrŌž<Ą#śl)jbˆUb“$~>­f š'“+¼Qóž(x~o)oé S]ŅqÆӉęĢšū¦u] -T–čļ±·ćčŽŌŗ&WÜŽāv”/4 ų¢ö“Ƽ@BVĻ‡jµlZē:¢y|Ōü·»eaŌ”»®Dč1 ~V°ņ¾ł`pTł@%’°:ʈč'Eū»Du+½|€V“$;fŻ>r®²Z„źŠ^į]•ÄOtwtJ„" ÆÆšż.uƦØĪå8 Ē†9Ż9/ -Hū¢ˆ@t;ıö„Õ–—u‰ }&讖©Ÿ^ŗAć·ÓõĶ6%«ly{zėoN…uūQū«ma»VžJų؜vū ?9Ÿč° +TVhāįhkĆ³ĆƛWżįłÅMpqņ¦S¢¶üŅƒ{ö¶cmZ×Ņž&×NYZõŌ×xMRqõ[éF×Ėt[­oJNĶƽi\µÜ.ŪW|6/ØĪč!rS–­®ČÉ?Żį²Ī¶ā›ūä8ļŠ–ʇÜ䔅Ļm{“[#†©ī”š“([ƒÓ˜{/=™-ž_Šz®Ų³³%Ż<äžŖęŖ „E“•y[Ż&QµaŖž{%I•Æ»Mˆūźź$Ć]h©¹@«ķv¦­kłNnjPK%¶^ŻIaŖs\†)Œ;lõF+¢×¤–ŁŅē]ˆæżåōUE観p m=ĘBcõNT0õĻnó“"āfjō՞Ķ}§[Åąź¹›kå‰*wɒ¹dŠŃØ׈ŠU].X ł&wi¹ž×_aŲ č’ņmQ”¬ØfŒA”ō€—ĖčŲü…ĒE«oU…\ź ”5ŗ=ÕxŁ6“’*°&¹×›‹— ` Ź˜ZPFēįŪm…e==·²Aŗßų˜,½°xHwéh@_ĖnČōķšdųLA2?<ƈKm†#ŅLóSjÆ‘žķ\QJ9¾ž†ćĻX½Łe ¶:ÆȝDå÷°ŗ+®"‰ ńU,)Ž¦i®Ņ¹Ä`AӅ}q­ø–D³U©äåčŲt‚æģŽ;LÓŃŻDZÆ@ąķ˜.R™‘Ģ±|Ėg¬e½oĢŻ+6BĮq;Ģ|eīģŪ…Į–żDˆf!ł&ŗģę[Ł›Æ‰€gtk S7žyyüóźxķ!÷Å+KÖ6¶†8pśCČ+Ō†ļ=\l#…¢z&}”7ŽYˆy9ōeq¼rµQæ_!®aHEĒ{sß],ß@ ićȒ2Ō?~ī{\åōĘŒę%ÅĖ©,ž˜WQ[<—ćŪ ³9YŽŪ€ż±zƒńeĘnąZ»Ø› ~=.O4U°6+¬nZ*²7_æRįšżŌŚ]‰~”¢e¶±b‰•‡J0JV|6 ØĪZ×2ZŽKJKškF±=Ū%õóńÕąŠ©ŅĆĶnEg§Ó#^dęU8µ‚J.0›AT©yfCŲžÖŖ*Ļ;—Ž -(į( @³ę¢"Dće„>Īh5a hb1& †M*ś»ȃV•Y›2+|-čĒ|U?o:Ųzłk_¼ŁĀāŻܙÓ%āZŌNLżćņą7Įu‰°Ūb7^K(5 ‰"ć¤ ŁŅŒrŠIĻ+,*•-K8Ūu*ÓƓ93źxuż±|ą JŻu{fQ§¾d°½}«"÷³ ‡,ŁīO³Õ@/½Év”Ņ÷źÅĄķŒåFżb:„ųŚĮ Žüœrn‡ŲWņńmĀP|žžŠć -µ®ÖYN½wøßäKõĖ/F±aźkčĢ #ē‚™”Iō#šKŻUß;ÅjkŠēĘȒJ9‘+{õ/ Ń0‹*‘ŖZG×åū€ŁrHŖ+—qšL½ ąģ|Š?½¹|^÷ÆN'7x±Ī„Šŗ]ļ$ßVÕ¤…i[ŪpĖÆņž4„ģx.nŹ5wt0§^|¶‹€µŻ*^˜ę=~ʦ‰N ģč`öL靃ŅūĶķ‡ų–÷xī`Y“¦Āū> 2Ķ:4č\·‘:×£©x‰œž³N~ö^ÕĒ"eQÖķšŠœ°n-Ć+i•e¤·ŸƒõVTńĘŻŖļxūÖw …ń™¼ŪelsŖ•Õ.¬÷\¶,Qp•dYˆÆASŠ”æ«M_Te">ąŖµ­IŽ„‰}=Ķ®øŒ#c}#š9šĮL\RzP¹£Y½«ö vō-Q»…ĻV·ŸfēżČnž•—ŪnŪ8†ļżDnr€×Zģå¶ŪÖõ+l×6,·AÆ ZÉDeRKRQܧß!%ŁJCQm€$>Ģ’ĶĆ!õö}q,FĮĆƈ<i©E.h’$2Ī4œ¤B}ņ‘* ±8‚×Ķ'W-¬Õ“ 1ž‹DŖ+*,EÉjAwÓhyOš-ņ‘aŌˆ> i°\Kv@’’ä5‘ŠLœŠ•šXüj½ g ’²Üź¦jP1}D¦H%ä76M›Ķ ćųĮÉb„2*Ę3t]œ%ĖŽšˆŠƒTGV æI%Z¶ĮØÜŗÅ\Ļ¢lRédŻcL¾ ȤüĒäwr‡FtÓ|{s’ĘŖOōLøŠ¤Tp„xŽ”Š®-uĪ(­ŗÉīācüŚ@ÄAS“§6"Ņ®”ŚØĶ/!G­‹?ƒ ŖŖ µO„Ģ‚6ÅąVv-~Ć [ĶgžƒRX­’J&±Ę‡3”FÓʚӬ¬ ](ŪE%±ā<µj› »L×¢µ!bź],µkt3HŻÓ(ŒĘä1Üż½ž¼#ÓķvŗŚ…‹ˆ¬·d¶^ĶĆ]ø^į»%™®¾å?įj>&€%CWš\H“FŹLE!éōSCÓä6źb–²ÓćYI3 ™xÉM³ OL™„Ud‚ķqbŚ6•2ŅW¹µ»äCŪŌ?澞²Č§ę}PÜ7nšżŹt’„¬[ē‚¾™<ĢĘ‚ŃH‚.%ÖYJz¾ak[ų›ļ¶’{K©<~}WŅ]×&ŽƒØµ¹«’Z–±ą\AŹš;8C„8üć9°ü鿘–ļ“jgŒ½ˆ˜¹Ąpó}ŁÓ‡Œk)ń¾w•{v•:*3šĢÅĻW—ø(]C(ŽE``™/Ų“1ļ9:†—čJbīxšć%ć Uć ;“3%fjaĻČž…Ķr8(’‚¦sŖéOģ„ęųF=¤ P¹óÜēb¾"Ś{p;*x“ō_ćtmļąęŠ«†zĪÕrÅUéą^ļts|¬‰Ķ ’Õw®sI«kč÷oFļߍž•TļoŚ0żĪ_qB•Z*F¦}l§uōZSCWõSeœ#X vf;KŁÄ’¾;'¦¬ØÓ ‘Ų¾w÷Ž½óĒ³rYv’ććĆHŅh/”V:æDĄ_ņ\8¼4Õ¼Ą‹B8wƒ„qŹ»žfq”ž®ž$–^ ’· ˆ±®•Dķ0oĪ°’žR³šµ°#SéL„°£a:ź}¢£‘£…•±M1VĶ+ŹEƒ"·ˆ+ŌŽ RÄ?™ĪĘW° Ÿ)×ÄQµņK:£ŌĘ>Ā‚ D–)N- -PšV”“˜ ›1yiŹµUłŅƒ©5Z·T%å›1•t‹q pLK\צj©ģ°nÅčĆwbŹļįˆpP·ŻķöNCōJ¬A•ĆgtĄ 2•K…­ŹB -CtĖn›ƒj¼oAĢœ "P³Ų=Ās4’–Ž—'IR×õ@„‚ĘęI¤˜\“²“ōźcnuĪ‘Z?*eIćłDIUIA.BŌÜĮŠØ`Ŗ¢¶¤øĪūķ¢ vŪō,Z,‘Øļ ŁDčQw˜Ā8ķĀł0§}øĻ¾Logp7¼¹Nf櫦7p1\Žgć鄾F0œÜsä×ńä²H’Q*|*-“ J+ŠŁŽŸb ģ–¶O®D©J=W"GČĶO“aRJ“+åøµŽŠĢČ+僩xö¹ Ś)łLr?2ĻXXųŁ:$I¹>G$a=ŗ’’{õ/ód§ž-®Ųš–ź%j¤bƒe½]S›Ūł”–Ń²hnZˆXU”“p„‡„ ½ -‹"[ĆQódbĘ@s$é߬SŅi²¾…>yŌŁ6f»ŃłŻ”Ł€ ?ĒpAķō¶’žŠõ›ŅlŌ`ģŹPE×OŹĮœš¾ ŖQ‹øFd4%ĆnććÖ„²|~ŠnÄ}RĢŠšų?ŪlÆlʜÆlæČŌžJĀ’¢Ņ2Š{xQ£˜®’ Żßƒ^hDꇒŅ„~rņR—/Ü='Ń}rų{‹½9„£=µųĄ‹Œ›ĆH”Ćå:ĒĘjō"ß“‚VłVŲĖķY5·=F’~ó¶9t”wxl:›ĪŁ§Ī•TaOŪ0żž_qŖ(Ui¦}„+ŠjÕ¶V"eˆO•ć\‹ÄĪl‡ŠMü÷Ż¤ŖM#RÕĘ½w÷Ž»;ŗØņ*ƒ0WŅ2!…ĢĄęų‹_2ƒ“'Ž•J/˜1# -wˆo‚£4˜€U>z\1N_‘JmĆ4ĀTÕ2a×GÓ# WŌ $:“ŅP*½)©E\[:(6e±DiĶ Bōéē‹åģj)ńtųD˜ Ž4Āę# 4J?@J©X’Wš $”žˆjĢ˜NœD®ŖµYnA5µÉEEõ–NJ4ķȘMā®,i]«ŗ•²£ŗ5c?(‘“üqōśą@½öߎѩG—l RYØ ¾dō6]"VV…`’{t«n[ƒ8Ž·ITģŚĢK•ī†³ķ>¹µÕI6M3bžšHé,ģ$†ßČŁy49&ŅęVh ¹õ³š<Ž×Ą*bÅYL\ ÖøśFł &Ēe6thÓ Įn›^Lė(’ōŻ²łõĘĢ¢\Ž£Y4„»ŁņĖāv w曛ń|9›D°ø«Åüz¶œ-ęō6…ńüŽ!æĪę×C@²ŒJįS„b*œ£˜ģĢSĒĮMKŪ'S!©ą$Of5Ė2õˆŚļC…ŗʵÖÉ„Ę£Ö•qŠ=mŻ–|&»\*·Ižą±0d4õŹ0ōēŻō’Æž5|”2ģv{oÉwÖ-;ŃNµ*”ÉĻØÖ¼6Śøę¶¹É¤¦Ķ$bĶō4TŻ¾Wo°˜:ĻøŻÜ*ū$ńÉ¢L lO‚ߍ2xQīĄ‚ÖWø/©ĶTt1¦īV!N¬¢¶µ”’®ź˜\„Õ¢¾o@§ĮŪ“W$Śźš[g“ÄfŸ›ßɃ¶j ėŠä€f%ø±¦¹yōŠIZKīÓ­V¼+Łß"ąČĒnD»ēĄŻĒēočĆŁŃ*qH”t½Æ ł°’¬ÄžœĮ!/Äa›łuvĻ‹VVŚ““æš9Ż?oaaš=Łr[~ĻXĮs¦Ķnžż -ĻĮspqü­TaoŚ0żž_qB“ -ˆ‘iŪumAE« jčŖ~ŖLr«‰ŁNSVńßwg š¶vÓ"!ēŽŻ{wĻžtR,‹ ģvčĀHf±VNH%U -n‰€?āSaqųäPY©ÕD»‘.U2|Š±p“q&¬%8gø”1…aN{ō 1żEzį*a@„čÓO¦³ńŁěń‰“ؤ[RŒ“Pió J%’Dri‘T“‘{" 4˜ -“°äX+#Ó„])4v) Ŗ7c)ŃØ!c7‰›²¤u„ĖZŹžźŗ=ųF‰XņĒžhSƒZõ×VēČ£s±„”wŁ}—‰.Ė‹L -{t­n[ƒ8ŽÕIōœĒĀK½ŲįĶ?€„sÅaVUÕžp_›4l$†—ŌŁI4|O¤ĢŹŠZźÖ÷Rźń|¢ V±˜×LT -4¹“«?™R†AsŲ_?Ų’}nč@µDv-OåźāŠ:Y#”Ö{wĮųæžy_0Ł‹¬?ĻŁ¼.~ŗpFp¦ŒĶVÆ'ļ׊&±7"ö! ś9ś[Ą/źCµmĄo@^Ę5ė7Bs²(÷n°»²aźčŠ’/Jū¾ÜßĒŽö†joWüT™e½]ŹĶt|ŽMēų‘ hļ”Ž_„½ å‡čŅ]|xų¢vk¶/ ž=™õ]Ee–x‹Ģ±v <7ŒÖ-čm“Æ·+ĢŲ7’”ŗæ,e“]/’…×:X'ŸƒŸ•TQoÓ0~ĻÆ8õi›JĆ&„eŒ¬KY“‘JM¶±G7¹&Ö;Ųī²‚ųļœŻ¤ bBšPU>ū»ū¾ļīņį¬)Ļ?:ņąę¼BȤ0Œ . -0%~ĻĪ™F{>eŲ.dӚtĶ3s0Ņ‚†eō—ȵi™B˜ĖČ™ƒÉüčˆ -¤@‹– -j©vU_m Ŗ]F`…B¬Q=H]śx‘F³ÖÄĒās®w8"ŠrSŅ®”•ź֔Šå9·„Y\P vD,PaĮTnUf²Ł*^”d+Pé’7T/µR’yOFļ÷eIėVn:)՝cø„DVņÉä5Š u·£Ć©C×l BŲh|Īč\&ŗD¬n*ĪD꩝ŗ} āxß%‘+Ū1`N -Čõš0cŃöPÓ¼÷ż¶m'ĢžHUų½D’šœ“š‘ī17¢B­É­o®ČćÕXC¬2¶"®km]£Ü‹V‘ć¢[“ī‡`Ų¦gÓzŠ$}ų€lc®G£ (ĮyDÉī¢ōrq“Ā]°\q… ,–0[ÄQ-b:Ķ!ˆļ-ņ*Š/ʀd•Ā§FYĔ[G1ĢSĻĮNK×'Ż`Ę×<#y¢Ų°”ØÜJ4Øj®mk5‘ĢizæUaŚ8żž_1Š*-¬8RŻGöz½”†ktT„½½~ŖLbk;ē8ĶŅj’ūĶ8ń-œŗ„ ö¼ń{3oĢoÆė¢ö‚ėk®a!J©’† )d¦ąĄæ¤oXĆi+VŃCŹk#”„“dMƒ‚½)— ĻĄ( k–āW¢v¦cšĆBµ2c6 -“Åš•kP’ZiؔīĻÕbŪ\(ūŒĄrĶyÅ„i¦ ē6żrµ‰ēģį3Ńō8$Š S`Œh Sśv˜Še™ £Y BāBe‰PóœéŒt¦ŖŽk‘T'¹n -Qćy’’,™¦OģŽE­{ÕRŽTإߘˆ$’:} # ?ģść‹®Ų¤2Š6üø­2ŅEbU] -&S‹Ō=?IŌ–zĢJµ;fM€Ā˜z]×M™%¼ “8™Ą]¼y·ŗŻĄ]ø^‡ĖM%°ZĆ|µ|oāÕß.?ņÆxłvK†Gń‡Z“d*Ø¢<;ņ“ć@nśŌŌ<;‘¢<™·,ē«Ļ\Ū”ع®DC­md†ö؄±¦¢yų^Ūt˜’?°Ü÷”ŠĘÉ.| ]ŸsvŻ¹’Ē{õęƔš Ć,ČŪ½]ĮÉEµVŲÜ -Tš¶‡© [m„<¤[sf‡ĒØ`§U…k jD“…Ÿ«9šģ}r‰0\f'ŪO›ŽWm V =×0ĒNŻ¦ū’w—²żīgīEĶL1RøLH_³ -ȗ(Ō†Ų[A²Š»!䞄4ōž¢R·ūc`mŃBf/ĢPéYYŖŽg.Ēé3:§y6[G!¹ūģŽŻ:ŽD“óéĪ#¢¢łķ&Āńxjž.\žæļŖUįĄQėC·bÆ/l„fĒ7±ƒö{׏Ō6ēÓ§ŌµqŌW~Ņ×srČü -d[–0¶ČŽō4xPZĄhØ’ųićBOŠŠ.(£źĪN‚m;©ożßŲ+¼˜Š–Z£…ģŒŠÅŲO‰ ;W_-õĒ+’ę»t[Œ¼æłQJ¶©?Ėi˜\ŗžŸĮčŃ{śéJžiƒ]]¢ÄĪVzhÉ„b“Ą‡‘[ūgOD/įßžlvā’ wzœŃ‡qŸäŃ{ō^’īż•UŪnŚ@}÷WŒ¬J\DqÕĒ¤mJ.ØØT1i”§h±³Š½ė®×14āß;³¶“ J‘°ž3sęĢ™åĆY¾Ź½ ß÷ c™"DZY!•T ŲžŠĪEühŖķX—*¾ZG˜[©D©( -B2ų›ŒPƒÕ8ŹED”^ŚJÖ…ćŠO4 2ZČ“©«¹(-¤uF‰AĢPŁb"ŗōÓŁ|rqKāÅųX5ŽTŅ®(FPióKJ%āXri‘‚Tt9" 4˜s·‘Ī7F&+ ŗRhŠ•Ģ©Žœ[ Ē-™¢Nܖ„^7ŗlZ9čŗc?(·ü~ųŗĄ æyź÷N:PŚBYą>; S™č±,O„P‘C7ŻķjĒ»&‰^šä@øV@/Ć@XFó`em~UU …#<Ō& Śƒo¤ģ4¼zK¤[ĢJ±(H­Ÿ„4¤ńb"'V‘X×TT—„Šœ2÷÷QŪm·f;h8|U¦é`_ >€žKP‹Ę/ż]KĪéī\.”Ū¤źķ÷°?”~źļl½}†Ć‹eZŽ/VzžĄ‡n{ŅūwEŅ˜ž?NNžéćó\žv¬·Īé''Ū¶C—h™ÖN^šµ@.Öõ”W—Śz[ļģ“÷­VaoŪ6żī_qÄ–eƒCµ“)®‘%ŌŚ\ĆC±8–“5Ė@*Č‘0“^®‹‘IjA×J˜2•ī·$)ŃyG¦lwŪ¢Ö®Z){ŖŪd į#"ÉŒ~‡>. ×ĪzƒS‡ĪŁ”¶P•b„Ė2ŅEby‘I¦øC·ź¶{ ĒĻm½¢ŚsR@Æ÷—³„¦?€ŌŚbģūu]˜#<Ņ&ń;‰ž{Ģģ, -CŅęRe¢,1[’VŅ`ŽW`²āl…\3VS]”œEm0ć*ŗģL°_¦]Ņ:Š(}¦¹yAÓȃ·A4†p5]¾›_.į*X,‚ŁrF0_Ąd>;›.§ó~C0ūLȦ³³!Ln%n -C"©¤ŒŠxĻOrK[§²\®%Gy*©X" Ń_…qĶQl»”D’1Ś#—Ö™ŠśįGm£¶KŽ`ŗÆ)µ•ųŚ:Ä÷ŗ>Ź÷ŻxēžĒן!óaHækō_4µ$ģØS”ņCGķōBa4Ö},)ē„c՞śĻfÕŗķy¼Äąt“<›MććĒŁæ(yń/” ÕtŹórdDŽ—ŚSøōp7|’žĶ`šŅöw—ļ£MwŪŪ¾vŻ~ĮŒÅw«äŚ5y{ü¬Ļļš ß ¼ƒ;ā1†’ƎĒwŽ o'“уAä¶wŪ{żWļ•T]oŚ@|÷ÆX”>DķŖ¤jJP¬F&Ā¤Qž¢Ć^Ģ)ųĪ½;Ē”’½»‡MØŖV‰%„?nęfvgļĖYµ®‚h0`S¹AČ“rB*© -pkü• ‹ÓZeNj%6ŅmķŅŗŖ“q˜Ož3¬ų damHŠ#Š -­ ”Śģµ¹¬½ŲģA±Dål"zśd¶ˆ/&°"ŒĻ„ŻćH@#ŻšÖH 6°"*‘ēro¤¢„Ā@ƒ…09{Ļtµ5²X;ŠBcײ¢żl%vbģžøŪ–¼nuŻZ9rŻc?ˆˆ-?Į -`PÆżŚėŸzt)¶ “ƒŚā+; /3É%aeµ‘BeŻŗ;ģAļ[½ä>‚šV@Ǝ—pŒęĄŚ¹jEMӄĀ µ)¢ĪbtM•MŅÉGŻanÕ­„jż¬„”/· *R•‰%iŻˆ†;čå@*CWÅŃ¶ Įq›^‹ÖI$ėĒ ØlĀ÷Ø7N!N{p>Nćtwńājv»€»ń|>Nń$…Ł.fÉe¼ˆg =MaœÜ3ņ{œ\©d“>W†MRÉÅü(ONKŪ'[a&W2#{ŖØEPč'4~P*4„“ÜZK"sŠG)•eč_Žŗ)łFå~d*1’ā©MH J}*Šüū.żoļÕ’ĀG”QŠMżā]S.9ó†fš5rŗ8hi sŻ\ŻĄŖ%FXŸäĻś{-G?OŽ” ŸŖü€8|^ -9x·| ą‚śāL9ź(lŽ¾IŲRtLäʈ8„ƒ%Š½qI»{RĮž1(,‰gD{Ūf®y0ydä’Õ}xČ:'‡‡Ā¾_½·ĪķJgęhō¬÷ŅwÜXn–ķ<‡0÷L#xi9waś§žqģ‚³ÆĮo•TŃnŚ@|ē+VØR¢øźcR5%T«•‘bŅ(OŃq^Ģ)ö{>Ē”’ŽŻĆ&ŽŖD !›¹™ŻŁūrQlŠ^0ö`s•!H£PZéÜ’ČKQbؕ›Š,[ ł05z­ŅŹb2{’X8e4ČL”%q0ĶO%Q—˜€3žbRI?±Y»ZX„¹©t"<ģtĻ@hĮhd“±»×aÕŖrō"Ū3‚H-bŽŚ•c€ŃÓG‹e8ĮšÄ3>QåGjå6T£J؍}€5Q‰$Q|“Č@iz‘{! “˜ -›°oiŠ­Uéʁ©5Śr£ -:oÉVāy+¦Ü·Ē’×­©+×M3Fš‹ˆŲņēń'8„õ›ūƒsĪÅ“qP•ųĀč»LrIX^dJhéэ»Ć¤ń®!1+ž!oĢŗ[Ā1šæēŠ³ Øėz,¼ą±±iŠZ ~Rg£xö‘D·˜aYR·~WŠ"«-ˆ‚TI±"­™Øy‚~P>¤¢¶ŌqŽ]¶!čŽé„i­D²Ž- ¶ ?£ž$†0īĆå$ć܆Ėļ‹›%ÜN®Æ'Ń2œÅ°ø†é"ŗ -—į"¢§9L¢;Fž£« µŒŽĀ§Ā² RŖø£˜tņŌją“4s* ”j­$ŁÓi%R„Ō<¢õKR ĶUÉ£-IdBńȕó”ā}ų×ŪøŁ’oŌī¦āõņ/›„ Ō§ØƒĄæoÓü¬Ž QķĀ¹ÜŠ³ni Ž öIuvĖÓ„„W) ‡ÉdĆąļ-rō„Nha©{hG„ē@ó üŒEfQ$[Īiģ'BšIPż Õ’v1čyācć“CŹōž{“4ąŪĒŸ!šrZIGn@c}ä ćßŅ+rąČS¦>¼}£ĄŠż¤č;Įī"jzSųßu„„÷s/[§]öŃ;L0š{Ēü!„;;{EÖēkńä¹Ć¹;鎶3F_½4#ß°;÷apīĻßõv½‹Æ½æ•TakŪ0żī_q„A›’ÅcŪ±.Mf6Øӕ~*Š|v“:’'ÉuŅŅ’¾;ÅNÓ Fg0ʒīŻ{ļīōé¼ZUQ|rĮ LU‰ öBi„ š+|”Āa¢•Oōƒ(U6e¹ņ~\ -ē&‰•WFƒä_Ba ļJ¢v˜7dT IŸŌä¾ajj‰v»LÉ|FSĶn9ņ[2»’e” -7•eÄT±£˜ōSĒ»„­“«PŖ\I’§‹Z…y@ʤB»VŽKėˆdFķ±V>4ĻĆߌ†ķ”|!»ļŠ,,<“Ē‚ŗ¾@Ēa½ėž·×ź_ĶGqŌĶüĖū•šl»_YjzP9‰”ā…™ßM7ļVō„z²½Ś=2+ –bĖ[žDéy†sUŌ6ŲńæĀćhżę;7u¶ŲoDOu:ÉüœĄ˜Šćm-=• 46oĻŃ6¼“‡ūĆøĆ'‰V¬˜:äõŁż‹¾¶ŒŹŚµ8|óZĖėīNv<’~8ŗĘ%¤kńōōULowöčéušód†ī/¾ipCc6ąAŲ/ńD„K6=j­–’}RäŅ#Ś#j6‡=čŸFĻŃstž9ś •TaOŪ0żŽ_qŖ€Ŗk¦}„i¬”V‹†Ś‰”!>!×q‹ÄĪl‡“Cü÷Ż9I ‚M¬RÅń{~ļī?Ÿ•Y9F£Œ`!s\+Ē¤’*— æł9³"T,—ńf„r³œY;ßrQ:©pzE¤ ŗaž_—1GUw™ĮĢƒLŠ öĪ|3ÜōµÄ'¶ƒYą•uŗh¾üÆ£`Š¾ćZ['T¼ßŗ’0x`xĮŪ ßfXog*īØ ļ”¦öö]ĄAó6kn2ĻŚ‘£3Ć - @bĒ0>‚c.{¼Łłš2šĻ¤RÜ«ø»ćš£7‰Ē/HąŲĆ÷ō+żĪ““<Ćfļįcśt±Ę[‹ī±ÅįSü÷KRį`H‰Į‚P\ż†diz>„ćSÆāiš48ū2ų•Tao›0żĪÆ8E“ŚDY˜ö±ÖŃ6ŃŠ*2•tU?UŽ¹€U°™mJ²Ŗ’}gi¶Iė†ĢŻ»÷īŽńį¬.ź œL˜ĄB”\IĖ„2[ ą~Ī ~ÕŖFmw‰² ÕČl¾åX[”$š’CŁąJp”3°Ź'G5ćtKÕʶL#ųTęӎ£t1zD J¢ĖV*„;Z¬Ke‡,׈Jkf)¢‡O–«ųb¢ķņ3aŗ<"Š -[PŒ0Š*ż‚bY&\iV‚tPy".QcĪtęsUļ“Č Ŗ•ØM!jŖ·rRŅÅ@ĘtĄCYŅŗSM/å@uߌ)|# 'łżģS€KõoGćSŸ]±He”1ų‚č»Lt‰XU—‚Iī³{uūÄń®Qk7=`^ -ØĶa0ė²Ż °¶> ƶmgĢž)‡ƒÄšŠ:›¤ó·DzČ¹‘%CŻśŽM=^ļ€ÕĊ³5q-Yė&čå @,ZM—łŌe›Į‡cziŚ@‘¤PŪ˜ŸŃ(J!NGp„q:…Ūxõyy³‚Ūčś:JVń<…å5\,“Ėx/zZ@”ܹĢ/qr9¤–Q)ÜÖŚ‰ ¦Āu³? œ[ś9™¹ŲNņdŽ°!WØżzŠBTĀøŃ"™‘=*a½©Ü>ü©mÖoÉ'j÷ƒƒr‹å{‡„!#×ē(ĆŠŸī’÷YżĶ|«žźZ ērM[m‰!yJŅ ÜŅxh”īsE3Ī©±42š»}AŽ„Ŧ„ʬ5Ó»’ÕžŪņ:WÜ”lø<dtš’Ż5!R’¼Õp"Ej°}»÷ĀŚéd•›ØI™f8ū’?|ˆ’xų?ż.žśū¦‘Ü—»æēÅć`ģ#:)ī¢ŌՓ“_BG‰ÓšbßÕGEžy7żĻļÕ憏RFŻšÓJsõn­?ļ„[ņœŚØ7ؐ8ŅTŚ’SMT-”³qؑMŪW“Ą2 ³»ĢXĀń$ąC Ō‚|KSj!ŁsNNĘžÆOQąĻ ēhĀ;‡*Ū‡ī_æZ šęšEĆĪ¤ žŸń`ĪS)ońrB)ßüņŠĢ6ud$(¬Oź§ä·ƒ}(žB‰»¢]VņŻˆx iŹ}ˆ?żöDé2 ¤r|’¢ŌYņ?čF8.ŠB×äJo4ņĘ½ŃČėķ?tb½U©Wp{›vš{ µA[¬ļ›>ņE|čļb4z€—Ē4^žöī_2—†{,_½6ļł9X,Ö-Ć ¹’!Œ ōm ”’6¤gžł}p\¼ ž•T]kŪ@|×ÆXL!¶q­ŅĒ¤4u›Š"§!Oį,­å#ŅzwŠā†ü÷ī­¤D”Š“cū“3;³÷é“ŚWA80…•,R­œJŖÜ„gĀb‚ĪŃQ¬ŻJ×*[>¤X9©¤…°vNhOš]¦Ø,fą4ƒ•Hé+Ń;׃ĄXĮøń"YM€ž¢­Š£µR›V‘ŪŚŃAŃ2‚Č b‰ŹŁ9@‚Čōńz/aG²=>“¶Å‘€Fŗ=ÅH 6w°#*‘eŅ§HE% ń@ƒ¹0™wœźź`d¾w …ĘīeEł6ŽJ²źÅŲ–øOK^ŗī¬ \wŘĮ"ņ–?Ī?Ą˜‚É 'y -ž‚ÓĻĮo•UaoŪ6żī_q0 -Ų °‹³Q±+µ—Ņzˆ\£=JbSy~—[?%ĀīOB%SŗI…®ĻŁ$I\ļ»’æןgĶŹ¤Ÿóggšū”ÖŅā#@Ķ– CźA6IaU;ō#įĮ¬nt^»vØķŽŁŻõ_ć¬œ%» -‚ąķVĮ°n1²ž_g’ATšó“‰›õ~ӞƹĖķOŃ¹Īé - ®Ī‚Č2Üō«˜ÜŲnļQėTIŅ«Čƒ^ųVÅB•O #Ż7±ąmÉryW¾§;¹ZwdŠ§'KżˆĮ@Ą¶ Ŗ+ĶV…­+Č āŚi\Ex²§|ū0œač¢4ė?`¹8ś5PEaįD5cŪ·Įęƒ{ź$Ž7µÉ¢ūū¬wxüO“.‰ÉišK2uQŠYäiė%׋ō’rPąiÜ{pöræEohŒ£ē^9§vć1”īmļ£ ģź„“'¶včLžöD‡Øt0ū&:­ -żłŁąO„„Ļ±{xØĪčK»’iŌJNżFŗ!ø]ōƒ…Ć$7ņŌ÷ @GvŠŃŅ—¶‹#­t[Ś#-“Ś| „y.¹“(A*šØ<4X“3ĻL×{#‹­Ż*4v+kŖ·b*é,€±]āP–øīuÓS9aŻ‹1…O”ˆ)’ż -cŚĄAĆ~u8yć£+±„4Ł½Ģ—€Uu)…Ź|tĻīPƒ0~ī“č5÷ „§zsŗ „ćhžŲ:W_ÅqŪ¶‘š€#mŠ8PŒ?²‹ōöb>Ŗ­%µžm¤!×{5”ŹÄš°–¢åśFyŠÖāŖ˜r“ &8mÓQ“‘ØŸn Ł„ļŃ0Iažį]’ĪÓ)ÜĻW-?®ą>¹»K«łm -Ė;øY.ŽĻWó傾f,>säßóÅū) IF„š±6L‚JVó? ģ–¾O¶ĘLndFōTш”Š;4žPŌh*i¹µ–@ędJ:o*Ė”?p §äO’ū §āćä'v½CāXė Tqģēƒū’{Æ~f>J‡žņa–lmCևv‹ -w=~·Æ‘Ūńīą©BīŠwf'Œō h¶°°¬2fŌ¾’Ė8ųėätųčPå‡ÕĆĀąŪ€ü ž?—pC-p¦É5¶Æ$¤_fr”D…QŸ$ä"ģFTĄ–¤žĆ…EĒž^p _ >øפ_cõČčVWHg™æ… éĪžÖh^'sFg+łHž§‚ź\Ŗ¹­p¾šīXPr pŻ”[{4ŅēłBs¼„š.On{Q–ŗåœÜ{vwWÜŠ1ĄWS W÷Ø÷Īę蒗ąŽ{į¦ LŃš5? 5b’Ž4*ód²ŠŪń³^L{”¦ēÆA5e9=w £>x_¢3?®ŪQŠC &o[äĘtĮ=cÄ~ÜE0x’5ņļŃFzż!į]:ŗ1R5ž9$:V…cÆÆIĀZŹÆ/:"­lA»‡GsŒ¾uūŸFOųKĖftfļ[«é|ZY(=—„BOō¤tž„¢l2†gŌĻ4~•ć‹ $½<8:•Æh6:OĮ(½Ä”ŒF®øŗzŽNß ó4x¼żcš•TŃnŪF|×Wl„>Ų†*}Œ‹ŗŠm5B°”éKp>®Č«É;öīhš)ņļ=’Žƒ@E+Ą&ČŪŁ›ŁŻŸ.š²™egg3:£µ©˜“³QklA±dāOś -|WŖȏģƟ47Ń8KŗR!%ĄwF³ œSt “j”Ęcē±SžiķZ›«;YķÖ§„Wöä, ŚyŖnöę¾ųP Iž¹fƒhĒœŅooö›Ėk:€®ąst&–ˆ1:ēč€T*Ļ\­*2źDD€ž åsQŖ]Ó{S”‘\gŁ‡Ņ4øo/Rvė‰LO×BkļŚQŹ Õc1ō;‰ä—?Š 4Oē§ē ]«ž¬‹Ōž’8UtA¬n*£¬NčQŻóąųaLāī„k¤’r‡—a¤¢ åØŒ±ye]×-U"¼t¾Č&‰Ł;Tv»»ž¤'Ģ{[qØÖ_­ńØń}OŖ+­īĮµRt05*,:ŠŪb!č0™ąe›¾m¢é/P6•z4_ķh³›Ó›Õn³[ŠŻf’ö꿞īV··«ķ~s½£›[ŗ¼Ł^mö››-ŽÖ“Ś~äo›ķՂ%ĆUüŌx¦F*Źł ?MÄ-cŸBĆŚŒ†<[“Ŗ`*ģŸĘ¢a_› ­ ™Ćµ‰ÉT2ßj[ŽSņ Źż ©d Ņ‡ĒŃ!Y¦ąś‚m–„ļ“ū’{ÆžĶ|H™M#~tœøŪĆżŌ•lå «ž„bG½qmØzōףb’µ9 Ī-a -ÜM&J¼˜ŗqؒx®šÜ(›Ų~HYx„łŠVUæ¤Uź4?)tfźRh×VpÄDŠ•qA’H#Ķ•«…ØŖjŲ,„š$H¶ƒņrm Ēq’ž,énR'ÓēY³yÄ|Ų£…YPī$ŸčĮ„č{I¬UŌ%“.†Īļžd‡ŃåČؗøÄŌ5ēFÉ{2Xt Bdū¼¢óÓÉ"Jk±ićĶ#B’k²YŚČĒ;ĢO‘mžš|0ū{†µ@É ņ;£KT*śV£ĀŠ,wGs.GÄWÆj’1F‹æė¤m$ØŃœ_ e¬ˆ»ō?7¹˜h€8’ÜNĢ†Ń†%’׎Ē÷)¾Ņ‡oŅ?WŽEtóēĻ±õ–™¾eéyh­N…żųQO;D/FAééĆķ§ 5[~ąæ~ż|¾/•}iŚ Ģærü’Žŗ†“w+ó€­_ŃÆX¼²mņ®¦UķĀ‚®0«śaA×­±³å Ļ>Ļ.~žż½U]oŪF|®~ÅB0ąČbźG»n¢Ų2BŌ Qią…p:žØkČ;ęīhE)ņß;{$mż@žś`Č<īĪĪģĪ-x]oėArv6 3J,›\ŃF—ŠĀV’ĀŠZQćUNėHŠ§FĖäUhj²D)R抍­jk” ~ Ęŗ×RN 6Mj!ń“ŁMŲ §čĪ6&A[C'“ģī”šØ„³QŖ²ˆ’Ö§×MĄAŁ"’(œRU¬E”)įgóez3Ģ9?×¾Ķ[ÄhO;ė>¶2ņ\siQ’68Ø"NtŖ.צ@ézļt± dwF9æÕ5ź-YJvדń-p_Z÷¶é¤Øīš1¢ŸĒ/ĘÆčœ4ģŽOÆbv%ödlą¦æ “ś,U@ÄŖŗŌĀȘŻ©{®Žˆ]x„ōĆŗļ»8›’ˆ¶!Ō—I²ŪķĘ"[W$½Ä䝝eÓsīsŽ›RynĮ=^ļIŌ`%Å\K±ć ĘAE€ÅĪ”ć¦q¶ļMp8¦—¦õ!ż0mqFĆIFi6¤·“,ĶFō!]¾›æ_Ņ‡Éb1™-ÓiFóŻĢg·é2ĻštG“Ł#gž”ĪnG¤Š2”RŸkĒ"ĄTsGU~ą§ž»„›“Æ•Ō-!Ļ(öI9Ćf©•«“ēŃzĢaJ‡h*Ļ©ÓÖߒ7½©æ}’å©łŌ='‰Ą½)pQD‘$ń;ÉŪʵÖy ¬ć­šķ’;R;ż$%ƒ£\;ŗĘ œ•:”Õź.½Ÿ®Vtzß=<ŠĶŅęøMӛå|ńøŹ¦“Å’Ž(¢ c 7tBĻyæJlpp@§tNß’F×××tģ<¦ÓĮX”ŽÖ y¹ünµł—:Ā9±_yīŪźˆ^čüą Ą`o_@ĒtœpŌLųpŒµx|…’2#Zc‚øā_Ŗdc~ƒˆ‹N„śņæŠ@¹VČ_EŌJøŽ}G%×bUą"˜'ķ¬į•Š;gŽ `įčrĻ{ž¼ĮŽ{(šPrĆ>¶żŚ—ĻkŸr+FhW:>£_BĘźĖŲŲ4²ˆÆƒēī_»Ņ#ņjÅĪ-­Č©Rr+ŒöU¼‰ļŠŚŻVĖmü4YŽų>å؀‡ÖÖ`{£|x¾fµp¢"Ž%ø¬G²ŽĻ`ēvŸ³±ūõ_µß>æµM™3<3Įvˆ÷aÓ%¾<9DäQ‡)š./’9„„æžqš'ķZmoŪ8žī_1kk§šŚŻī‡’M›l“\ė&En±ø Z¢m"2„%æ“Čæ¾H²%ł„I?nu(ņįĢš™į ©_ßDÓØŃ{ń¢/ąZ¼P&LH!'L9š/ŽoLńkĪ’4ę -¼€)ÕÅŽ4ą½šøT܇$Ō/"ęįƒpœ,XĢį:L„ĻJh_ ®’ä1„’Óč0†Y›c1Jl "°IĢłŒĖDuœkų›Ū»žŪ+£˜4ŽŹŒC"™b”`Ę0F(ęū‚¦f‰ 3- Œł„Å>ič…Ń*“iįBņXME„óŻ‘*ƒk'Œ2ĄnZŌu¦V•‚ÖÖųHåWŻ—ŠĘ4Øiß6Oõč[ HĻс/=%(. -6‹Į¤§G[ķ²9PĘ?-H8¢Õ¦Up\ģ,”Ńō`š$ŃIÆ·X,ŗL Ü ćIĻ©Ų{–½\ż„B»1ŸdĄ•Bkż•ŠmĘ>Ķ{Ł<­Q«Y äĆ Įjö{mEš¢›ļU‡3e -Yƒ+‡’Ś'1^ÕĄa÷>õīŪnUD,™ÖMx²tµä^š×ķ#%†SäW²CČ·¦W„Œa-Ģn '_D„Ž˜ E‘›õĀ]¹.³8mh} ÄØ5ø‘g+õW?w_v_œmu „‡ēÓŠ,o ×{Žö:sÆ”7ĖMi_ŽA;„~0ŅŚ=T%“R!Ó»h® żūŚāBšˆ@$«®ƒČ ś …TÜæĮńq1.Ź×sņŲ²p0N„Gń¬ {>g1P˜–×ÖÓ?¢XĢYĀńFBŽDĪ@¦ApŚx‚Ā™æ•ś!:‡ø£0Ś01䩄Ļ×-TĻ¤CØj—<”OāĘ!ĘYHÅ-µ°wÕFqfœ8ęHv £0 k§#ÜÄܼNrXÅŗēW+1€År‡|‰ƒB&AŠeOuĻĒ’Ūmå; žmGūŹnÅŁ[ü(TbIģwRĄmĢūŹÆå¢sE jo5v4Cw”1ž®ZiÆ«Öķ”†Dż6(Œ·ļmµZ~ŌX*e¶$Ś¼3ˆ[‰9œL—Ģ¼Å²ÓķvA$˜ū“T…”ŗQĄÄ?^ŖāŽHȞE. }ŅjĀŪ“{Ūó~ cŠ/Æī-X—/yĶ#Źö%ŲbĖÅ@n“KK±¾ ł³īłĄĀJV :Ķś=n®{õ$g¶uŒfÉÅķĖøØH{kJ¾‘ń›;Św”|žƒĘłŹ”óI¤ÆŁĄŸƒõśyhļŠž•÷UöܟųYRqóŻØ½©_Č]¶rßYč@ņŪš“—,’'Ī!óĖ„ļįČeŌŲ)Ū©…Ņė<ĀŒŠ+:A` -›0ņ,=ŌŚÓĢžĆlŹaė^uā\ńkžŖ.(ØČÉvĀbé`ž,22‰SNZƋźķ²Ļō•õĢ!ĀäÅT…DśĢC`U]X–@ĄZXĻV -^‹ŁĢz e˜5ļ-īB_Ł&ł¤œW&ӅJGĢü0ė½Ó÷²)†ĘPÅY3ūWyįöšćĪŌC:Ä¬Æ Ń4²mėsķ:Š|}ÖÄįßā ™1imēLä’ŗFUń}mq)ˆPĉŠU—Ɂģ“™Ŗ>¦ŗ[E~ʟ Y֜•®Ā4†^f"Õyłś7lʟ@Ć\Ū5ÄįźrėQ»v_4 ƒ‰˜s öĄAć8]į-ī)s&¾ÖOn×ņ˜¤ -cLףīք›–Ņ „*&…ƒĢ,.īŽ—s‡t£. ŖŒ˜2Wž6Čą~E•—¹‹4@Gt/L!½ ×ø[fwrééʛ2žūŽ¾OīuA—Pn½Ēv§5čc ¹t)f$”źų"čJ3U^±¢EŠ‹IŖ©²āøĮ żŽ†W7üŪ¼łC1O{”Rż……Ā"”­Ä\Ļ›«Ņ~p¼#³Z|{0«®dsóTF:Ēl5|ą«ü“S«Ö1Šn {h"šBļēbÖ^·Lu1@ž`ęmĒ—ģ} ? cź-ņ€ł]CåŌ.®{{Sń­Ē$vÉDˆ—ūQŚŠ³Ÿ -Y«Óć°“éŌŅĘ-:jT¼pA§źäšöŪAå›K†é¬|eāl՛A*Kp™sĖ•Ž—C=G¾ˆ)ōńe`Q„8!īU,eńĮŒ…3mR33mśQ1kżĢōōz:å>’ɤVō儢<ŚLR8Ģ˜ĮŠb›‡Ā߃r؃Š±`ś+ -L”1>­½iSa"W& Ś†ē‰ŲKg”ōxü¢˜Ļé! }®ō7*ś3š1ZŒ×ł„W%ó<®7įP#Ķ§ „į<’˜5Qg–­q0PzÜĀ”Åōē3„h¾ņįX›£ž –]b–M˜¢ŠüJ«ųŲūš­Ēf)©/>õ+K UØÕ“¢ē±ņM¹µÜr™ÖxQ…µ'‰Ö™R“y*R¶…4;˜Q…¶›,Y6w¾Ī”īn’T“ĆŹš .3”¼²#Œ6§±Šeßß/žž ’¢įyU8¼æ/Pnlž/&–”’Œ’ćq/®l %ˆo‘„ZÕ|oc^•ĖTÅĶŕG_wśÅo˜»ązmFy Ā6³JīSŸ¬YL$ĘĘ}Š§˜d(ÕÜęŹlvr7ėu°Ģ/~?`šSd,M®N3¶HaV&yMŠÄ -"ć³Lˆ…Hr9dl,æ¾¹»ŗødÓ(¦õa$Õ:@`ås˜I¶J³G6P< #ܚĒ,JąĮ‚Į…™˜ń,Œ’l½\gŃlž³t•ˆLĪ£%ģw‡¤Œßd¤l¶Z×i”IqØÖĢšŲ_’üoĆ#և øh_īŽiõ‚ÆY’꬐¢„ĪÄS –9  ˆ-–qē€Vkźģ€ćOH:É9ĢēD -K§ī4Ęs\’36ĻóåČ÷W«ÕĀĆ4›ł†D’ąģõųņ6kž’ÄBJąÖQ<ž¬_VŸ®1_”IP¤€Å*Ž'3WK£®˜J¦tw°“ŒöĻĒģj¼ĻŽžÆĘūxu÷żĶ_īŲĒóŪŪóė»«Ė1»¹e7×ļ®ī®n®į×{v~ż®üóÕõ; `l%ž–˜FČQ:śdp@mŃr’KDÓ(ņ’YĮg‚ĶŅ/"KPY–"[DE+ÉŌcå¤T—6hj+93J½»6éü¢ū>»™”š™ļÓj’L‹L©ĪzD:Žr‰ü=mæģC–~‰BŠnĪ¤ˆE@f - -$‘¦ÄŠ„€?’œ-D>OC‰R^ŖUlZ$²®(_#8d")1²†¾ČµĢłĶįA ü3ģøCuOÄsęéJ2ųa+cŲ°÷­ - ń‹Š›pé› Å)}#O_|ä s "Žõb _ ĆyĄśQÄ™»,&!Ørž&róyĪ€F VĆ‚3šā÷üņž`0ńK€ģƟ£Q»>ŪĒMö=Ę³ŒÆū¬wvO0ĪzlĄĒšč -š(²8å”Ę G“Ļ.)ń±L‹Ų ~( G$44˜iWZx}ė!£ %Čv;ĢD^d‰ĶŖ“Ōą¾š,"³^Ķ£`ŽV¹äR*£ĻÄTd\ѐ3ŻĪåqš¼æŠ/>L¶äķ{fÜņLf?üęĮ2į›3}3Ēƌ—Ä“³|%eŽÄūšĆøZd±Ögč»”Æål¶OŌ|«@«G~ĘVŖūNiÆo¹ĶD7Z÷‚£:ƒlȖ雋ܮÆ{Č2qühs‹¤R1`Å6CK#ŃV- L0Hct ÉjH„2K -·čf‚ü-qoÅćĒ’?Ra½T„ś „®É -|œOõÅ(ŒV˜‹§—óroć„ ,œ|ż1‘“Üž° 8ōārĪ)”‰|%„²ƒ0š’~ēl#MJc÷4O!V'ь‚²ÉTŁŽ4š“½M 4ż‰Lcˆt%”8|  ž]”yև%|!h \ĆĪśW'«a}YŃō8śĀÅŌK¬õŻĒx„“¾8Ö€|ųžCl ZŒĄM®` 'ƒżs‘Õ5āŒF\ż{ -u”ef„W›Įģ¬¤¹c¼N·VʅØJõŸžÖ "U,­p*ź~”%Ū߆æW‘ÅĖs84 •ķ‘żł,š%˜ÜFS¶‚ČĻĮ¼x)t;†ū%œO=\ļ3{ĶŽžžptt¤WćG ļŲ>{Žs÷.– ž*–JģC×į)„}Ź±?}WɆģŻÕķåÅŻĶķOćĖē·ēšžZŚ[€ģēß~Ū6„Jɾ=q ÅG½Ļj²FŽqZĮ¼¤ØļNŌŅµć5„‹n²Ńę±Œ£"˜Ģ¹‚ 菹’2ĶŅ…ćœ\Ėsģ6'}‚sqt5˜æØl• FŖʞ²ńŚ€²y&Ńččę„ś DFi¾ā”7`%u[VĪÉźū*B—ÆųZB ˆČj„T&؅”Y(` @Ž*-ājR^hļ„ų5ƃć-ĖĀx;d½‰¢ŚŁŲĪ1Hų£Ē­Ė!ūZĄ„g³;@"„r¼µ–E^™P–q1YPį_å’Õ€€ČZŻsƒ„Õ±!»ŹĮĖ®jÜĄƒŃ‘āStu 7ŹvXå„!“'KŹ(„sLšA¾;ŖIäMŸŚļqtŗÅĻ½R¤2æį©;g折Šź­«³üKó “_Ļ¤{š¬*üÄÖP·š–X]ƒk,K„Ć³"ę¶B“U'•Å˜¦4Kæ 3“kæ&]¤ō<”ź"T¢i?ˆ,fö‚ž‹‚,å MƒŅ/7×Q±ågGÄÕ|·ž¶+–öćģ«;§-“«īØ6ŁņŚųzż»6m=©%¢5 ÆS—Ļ3¬E½Nsź"]R¾Ž¬QĪŹ WŽO–č± 8óqż=꘩ iĄo0łį†Ķ?ŲŠ·ķō™õŻq'ša)Ә‹™ą”*ˆõĪŹ}+“¦2Å$ĘXażz%ū¬¤'*Ė«G”“ZqŅˆ5Ī+#½nxäz¢CłĖ«H>\D°ąéH]ˆĶ,«b®RÕ³<īQ!„?Ļe®aR™’' įéYĆć0ķE8·hGkg®1Ż^žæ«aæBé~¢)” -Ā2…‡§Ø/—Ų«“6… -Ct"ŖņI½ų„õ†=ö÷æWĄ“AeI~0DIįdy5<‰©6łŽRå°S©07±~UO§»t÷6Å6%”ģ䔁ŗPM?ź[ÕØŲ=’nĒ’ķC·@UĪŸ+ēƕC·(ĄPĀåäŽö9›ŠĄS$XÕÅ*/q]&0Ś™š ˜] qwĢ+ …6xˆ‹Ø;Æ<]Ö½–Œŗ6lŹ’„›ųA‡ńń-{@oõ „ćų”ś“‹Ö"‹Ō¤RaÕi>Šž~TAŠx:u:Ē-JéÕ½¦W÷’ßŲtųÕ=ÓĆBd3DĢ x% -0ž›ęÉsØõūŪՁØio»Šž÷ŗ‰XŠķšv ©Ļ”qnŠ1ģ8)VŚü_‡8ģČ5Ķ9}ęäYŻćhųWĄ{,g©v£Ų[‹n˜ƒAµ?&Qnū'T%µ[¦N¶ū±šCÄóXpąš}†²(ӄņ» ÓCNrh #Io±žŲEųQ²æŁķÖ7¼—8Ֆķŗ·,O„]yń3:Ū‡›ŗŁ|Ņ*ĄZöńõ”Żņ#F -¹Ipu4¾Rp’rkÜTuAØLķQ'NK=róÕ—j§Š©ē« ©ŗ.¶.ŃÉx -Ź@ć®R؝ž&7½5Īlńā;·Źņ6w^ž*æÉ4Ėčąb¤ØėjŸauoŚg/h—}“‡čŗ„bŪ&ų‡µK}®güŖ 0ŪĖŁÜŪ±f[R[ś`»5ĄŹ~ÉĘ>ŲK`ąßruÄ¢ŚµćgĆPÕł”3» /@3×F>’ŠĶ -pØAČ9źÕ,–łZןŚH÷ŒrV Vė#-B‹$ ’(vć&i”bER,&x©dj“ėH%cīQ_ŗW)®²HĄ'‡”›`ÆZ'-ŗØP(ė5CöVÜÜŪ0 ņ'§1ā -µ’KŹSWDf” G•éėiPŸų }Ō³Æ ŻżŚ&‘F°Ä vń’Ÿ6~j'Ļæmćēµk'`W`qm[ $i»ucøm™:Ļ™9Ą^Ä+U=Šõ‰AšŚŻŪm®2ēśä®~ˆ3Ėœ91 ķčø{–ŚąsuVõ|-Aźó5{FØ=I¢¼-E“>›óVŁd¶Oź]%§3_n愲Ż„t5}g+ąbƵĮŽ7+J!©ÆÆt.¶pü¤vxÜ>»ä|ķT±Š€6Šäė©|ą9Š™Ŗ¬__­©ēTƒĻ¶äŖ1ÉfYõ4ėV,@¼»œSR¦²ėI„»0Ó[ē©žZb „/^”4°0“sŹ^Ąż¼™œ5Ą½ń'§\²źq³hŲ—šséž}-Sa?*ePĘAÜ+KÕ£"3(2¼BÉBF T‡ -mN%M»ø?Å ×J–Ō=•ć§OŠńĘ !óźŠFŲiæ¤ÜÖ¼¶ŪģŅ¼žßģO;ˆķŚŸvll OwéRf)J"śMVRBuŲĄü®ŗI5Øė¤C<Į»„˜+õ]ą/ˆq'ĪhT)1Z1Ȃ1¢įū~ƒčŠr\e‚w¢Bß^Ť\ļ¤ÜdÉT~„ZkęģY·… óīK[ÜI4ė7ÉĘUŅ\õŻ H†|ؚüž¹žķ5§¹ -³}.*Į!sĀ€W AęÓPšęAŌƒ"†,DźKš=¢Ć•^™3%æŒā½ģaƝŒ ”&Ų}ĄŃzO–Ø#$šSv?š„‹ułÖĪ£|ć²ģ*ؓd§ė‰ÜJ)ģ:LŁ^ ¦6ŽŚŠ£]÷‡6'©!į\Š„V¾ĻSŖēvwP±a„ dS¦<ņ惹mź"mi®ąvC^žÕ™ŒBé§›“ -#×[-ŃŖ¾Wō)ś[r„1O¢ĻW$ ÷µæ Ķ2z÷Čź‚ˆ4¾¬_ŃdKŲßzq; ”·īyf1čŻßū=Æ£¬j{źŽ$ģKˆųóė 6@Š§e VŌo[`ŁvÜ mĖ2šUkŅjT<Ö§„JWę.NÕ’kĮixc;jk«Ļ>Ȅċ@ą {.ęģ‹›KPrMó~‰|…U­3ėÜ1žŽ}ā,ļ<Ų•—”SØå>Æ*g)MŒÜ"qńšœõ­‰D)“ÆŚC)µĆ­-Ņc€p)šš'ŹV„÷µė-w\° ”Ė OŁ±6Ģ3į;Į­–ƒÆæs©¶±,£bš³a­€0{)¹1•·tI½¤¤˜H²kõÄĆū¢‡š$I«U©xnšfxĀž–FķkŪŒÓ3Øå]78nĖŪMō^„2f:WV #õNŸŲ< —Ŗ+_öŅʋ:Ķæ&cĪ»2ę²G.čj!'-ł'Ī ®z£|‰Ņ4`šmkuOļ<ą ģPz8ÓTŲˆ«)Ńļ}¦å}s¹Š¾’y3.ĻdEK:uĻŠ$qŽˆjŽ§Ų=6¦å9¶–Ö$MćJ\ŌQ‡GĖØHžk:Ŗ1ķāķų]mL;­.õżv-–OGŸéXÉƟ*įēÄłņ›^ą\_}Ž{ŽūītļæĶXŪnŪF}÷WL – E,ś(ĒNÕF…&va9 ‚¢0V䊦†Śew—’•Ā’Ž™½P¤.vō”SäĢģ\Īœęõ›r^%ggGp×¢ą*i™Bę`ēų×ō3|,……“`ĘōQ’„ß‹”KĆ3°Ź K–āŸ‰šŁÓ®U%3f…’ŠN®»€?¹%9i+ „żiZL+‹ -oX®9_piM`Ā¹3s{?]Į ]$żLƇ¬„£Œ0°Rś ĢŠĖ2AG³„Ä ē)jž3Qt©*×Zäs j%¹6sQāy÷Źä::c¼įx,ĘŗVU„uHF~GCņOż”ƒ¤tŽwĻö‚­A* •įėĄS^Zt[”…`2uŚ!ŗś ōńs0¢¦T)`.P³¦0KŚō`nm9H’ÕjÕgĪį¾ŅyCLŽcfo&WÆŠéØóQÜĢÖߕŠ˜ćéX‰^„lŠ¾lEt…r@/V3.ói›‚f™6I‹.bčMLs5:N`<9†wĆÉxŅƒOćū_n?ŽĆ§įŻŻšę~|5Ū;ŻŽü<¾ߎąÆkŽ|&Ķ_Ē7?÷€cŹš(žXj -=”Qž5š} “„:™’§b&R OęĖ9äjɵk…’ė…0TZƒNf…°T†Twb‹]ņÓż…LQ¹Ė€$aˆśaĪņ$qÆb|{¹žĆšLbg’¦ÕRdˆf nēŹ “āś 2^°5VŪŽ -VˆÆ¾oQjśOmŻōŸ"½C…wvŌąŠ2Ł°œ²¢˜b - ˆĶ>y„}¶1­·xŒÓåŲģcx#§½]ēj³OńFs[i¹-éäœĢŸ­$&Ž~}ŽufV]V©ń«¹Hē5˜6„'}älį±—©c¶¢4܎‚~•¾£ūŚtŽš²ö©’-jŅØōķ‚ &-פöl"É÷Ót–ļ}ł “FōRŻ*øÆ(”ŸéĆŚ¢1#Z”’n)#Ė`§ i¹ž±©Ė×8ć3!±JkZB„®·Ž•:Ż> e,¹Zµ½0šd!ŠTUN²ēZ7īvc×¼W«½ZØł`;šÖĒž ?įŽ‹ „¹W—DčŪžŽq–yd Œhp¼gZ³5ŹWŁĀEz -—`uåxØŻģ»łvF¹ÖĘOŚ:kõPń£ŻĢų¤*ć.Vø³e|É Uŗ ĖÜŽdBū-J„Ö¹ēP½n…ģńäOćĄ:ņīwŒļäØ6[ōĖƒ—›Įt‘K“²÷cVø­„\ÕB ”'_x½Ł¹źōÜśack:: -Dčl… .YQŃāŽ§æ]2jL[—Ģ/.żßnHŽšxÕbÉ,GXŪX‰CĘė#¶cf™Łr¬VՏX£ņ‘FQŸlīw¼/™f š7ģœŻ -ņĄnqj挮¾X|Ś|‘ė9īņó€e{ąøܚ-3a,6sŚ †ŚĘč²sŒĘzDUō/—gWīÓŻń¬?ļ’tż®§śŽ†p'I`4ēX8įYŅŽ–5źĶR[įakš”·”]r~q\s†K7ƒS¾Š™ŚÉqÆꞖ±¶_S5–Ų"5­6“µ§¤ē-ĖOGߙ€ĘØpc®æ''B>Dā}a¬ E»³6ę÷GńIŲK¼Ųcr”O;Lóq3b lHeŠ£Bęīæ/T³Ś %iŸų›mž¹Æ?oüJöYŅ·Ž\#+×{}nŅ"ĶŃ=ó£Yä?Ł k䛚Ć÷'󰠏-ĘXæ ,Ä#Ļ¾…[ßm>Tõ.;$ˆŸŹÜv^& ƒĢ·i/™k#1DJĀø1芩Wœ}Lsŗµ‘įnÜsW†3ØÜē«OGøż •T]oŪ8|÷ÆX}HŸučc[“ē¦1Nha‘{E×ŌZb+‘*IEqļśß»K‰¶‘śaĄ$ī g‡³|ńŖ«»Yv}=ƒkXé†@YPm*5}UÆŃӍ5{]õƒ¶&7:hlōWr ōžĮ‚§O%±Ė? -»:‚•ķMąrY¬®€_™Ā“uŠZ7 -pzמŠŒŒ€•#jÉæ(ˆ"żz³ĶonaĻŖ_j?āXĄ CĶ5ŚĆ`ŻgŲ3–„–­±mųC…ŠQ…®”†•ķNWu;r¾Öļ·•VŠUćGā“-÷z°żŌŹYדsų‡‰¤å§‹?į’ t1­^\=č`l€ŽÓ‰čAQX. k»F£Q=uw܃5~œHģN0¶v^-€:„īY– Ć°Ą(xa]•„³wģģŗøżƒE'Ģ{Ӑ÷ģ֗^;öxwģX•ĀkmpŒĄ*ĒŽ›j.hŸBp~L'ӒDnż¼€mĆxFĖņā^/‹¼˜Ć‡|ū÷ęż>,ļī–ėm~[Ąęn6ė7ł6߬łmĖõGA¾Ķ×oę@loE“&X©G©<ĖSŅ i™ĪÉw¤ō^+nĻT=V•½'§£#×j/GėYdÉńhuˆ”’yųo‹iJžb»? •ĢUüp?%$ĖS_‘ɲų=„’×ĻźGįcŹ,MśV2G:gļuSĶö›@nJ Į0Vš’IgŹžÅ1”T0¶ŠPlš÷Å ī)CxLmI ˜šXzœÄ–TFūöw½Źf'å?¹±f’Ī8žß5¤ŹÉƒJߓįAśD*Ģ%)ŽBļĢøČnureÅUī¤#oŃ?²(ŲU8=äÓbŖÉÅ0HØ3üT -ś?Ą×¶oŹIBäfK­ŅČӑŲ’TX“śWD¶j[>¢4}Ó<–Ē®;l'm’M\OĘē±fĀ·śįØ$‹O/C  ėwœPŲ÷FÅ_%—7‘ē2ĀÕóŁ·Ł«—³ļTaoÓ0żŽ_qšųŠN„A|Ä(°Šˆ©•–ŽiŸ&×¹$f‰lgY‡ųļÜ9qW˜„ØTE±}ĻļŻ{—wgmÕN’ÓÓ œĀJÕŅh/”Vŗ_!ą£ü(ž?“Ęz±£J{“…ø .»PµĆ¼ %ĖVHzd¦š½°+Óé\xe4L—ŁjōŠŒF®6c‡{­ŚužźDiŌŽ-2ÄæŽlÓOēPY®Ļ•źˆ@Æ|Eg”ƒŽŲ;(Jä¹ā«EMÄi” DøŠb)lĪ:„i÷V••Ók“®R-Ż·e)Ł*’qp¼–“īM7J9R=6c߈%æ^¼‚)ą¢“q÷dö6T7bŚxč>”>Hl=Ń%bM[+”eØÕī Ž7#ˆŁ±g ‚0Åń1ž«łPyß¾I’¾ļ"^[&QbrA]gē/‰t¬¹Ņ5:GŻśŃ)K=ŽķA“ÄJ†0Ō¢gƒQ!Ä¢·Ōq]Ī¹ŚÅŪōŌ“H‘¤ ¶‰ąŃÉ2ƒ4;Ė,Ķępnæl®¶p½¼¼\®·éy›Kų“YN·éfMo+X®oøņkŗž<¤–ŃUųŠZALwó£ĖŁÉm:† +:-¹ Ų 9eŸ„§nŲąŗ– “֐l*½2¢(ięĆ01Ųįc®2]3#Ž@ųŖP ¢9’dŗöTüģ+8ł9”i‚ŠWžĀ%śĪ†L:1GFg`?§}Q«GZ+¬ią÷œ”·,¢A_™šĪyšA¾‚¦\c’ģ’ĮMåy–ŽBDć¶ FW‚ĻÅęyEŽ;ōF*Õ=ź‘kÅžof”e+ša/<ģ,±ćjžm·£ōŸ§GōnoéśŪ€2żsövņk29{?ł •UaÓ8żŽ_1ZD»ZÄGø -lEjO›rˆOČM¦‰!±ƒķl¶œųļ¼q“nD„Õ]„Ŗ±33~ļĶ÷Ļ—MŁL’ĖĖ ]ŅRWL™5Ai£MA”dāŁkåłov^ū vˆŠ&°Ū«Œ‘#itĘĘsNĮʔE£2ü¤v:嘖¶5¹ -Śš.Ņ匰dGÖH²ŽjėŽē:½k6ŖcER…c®Ł?'J™cłõf»zsM{€•ü°bt:”ˆŃž:ė¾Ń„Tžk9ZUĄ:‘DĒ…r¹šĢlspŗ(ŁĪ€h©œ·*ér揅‡cĮõ`ŪžŹˆu/Ęż#ŠņÓłš"@’.ś·³ē1»V26Pėł¾:ń]ĘM\«›J+„ŲĪĘĻ}»“ž‘ŠTČīĒa¤‚dĖ—Ø ”y–$]×ĶU<·®HŠÉ(»NÆōóŃTģ=ŌśŽjwR PeŃ •ź¤ƒ±QŃ@Ń9(nŠ+Éöƒ Ęmŗm€źćȦb.)­Ņ z½HWé}Zmßm>néÓāęf±Ž®®SŚÜŠ›Ķśķj»Ś¬±ZŅbżY2ßÆÖoƈ!Žā»Ę Õ¢(ē#? Ä-}Ÿ|ƙŽė ōLŃŖ‚©°·ģāP4ģjķ„µ sŲ£Ö!šŹKź·y?%Æ ÷7)%ć7n{‡$‰‚ė 6I÷÷’÷^=d>”L†ߊĒ²JAŠĘŁ[GW&+Žxe†žB³8†²ŲĮP»Ó `Õś£+¤PM t³ūŹYˆ -„¬\VF3cęe˜’§$Éäął}4łwcS¤(ŸĖ8¹øNą§6“ė¤ļ,¦$bZ~DEUgĪąÉmŻ£ŒåĘUq)1k„€‡ļ:wźæ™]Œ”MŅ¢$<ÆĻ<Ļģę··i”¶‡‡-8„+#ZY!•TK°ž¼?¢Ā -baLŸ¬ŁįZØ †`µ3¦" ·©^ŲBdW:W”°R+č §W] ˜VČŽ:ƒDg>c&ē¹„/bÄ2CLPYÓ˜"ŗšć›ŁčüT&ū‡Ņx?* 6"i ŠŁ=,(”CÉ©E Rщ+„3\Š,䝮2¹Œ,čBaf"™R¾·2½ŖŠ1>p•–z]é¼l„Öu Fž @ÜņQ’ tȀŚåÓv÷Äy'bJ[Č n¢>˜Z*— -KŅX -8ļ²»uŖńsDĻyZ \+ u3–½ł ²6= Š¢č Wp_gĖAÕāąšO/_SѕĻŠŃBėŸ\f„ń|"„Ŗ1§ZcQšŻ ؊"#ÄÕ²ĒŽ¦"A}LŠŖ©õŗĮ&܌ŚĆ)Œ¦mx?œŽ¦=ų4š}ø¹›Į§įd2ĻF—Sø™ĄłĶųb4ŻŒéÓ ĒŸŁó÷Ńų¢HQ*|L3n‚*•Œ(†5>U50[Ź9™¹µ§–¹X",õfN)f‰4®Š«0ė|œĖmyŚüŹkœ”»„ŹåĻķR>äĮ ē¬Ā’lKdh ū»ŅWµLnąųH5čĢ1|äp½LŖ`ĀOH÷„!c¾væ5Õ¹Öńwg*Ķš!£ -¶Nīēųy”žšųž5QŽ®×Ż6c” V4Gµ‘n‘ĻŁśUę'T°ī³āńö¬HOƎ˜Ć©;&5"ł‹]:U³y’Ģ®¾b\“Ō®zP#:‰Ŗ–ĒߝöļŁY“yF†żÓђ¦Ÿ{\™Ę|e5=w½'ƒē~ćUĮ*F”TŲ”š­Aŗ„?ĪÓ3’¾VÉӃ½p`” -$š™Šé"Ķ!Ó}r×ōtĖxŪįyĢŲ*„Ū˜ŲšõįŃeĻĢJ(„Ė8|adA«?¾lŻ’8B¶Ž,b•ÅVršzfAĢā#£»cDė~x5œ]ĄŒf{_źĢŽXIŠ©a«{˜‘+įū’C‹dD66T8ŹēZ½8Y+9 Ä«•dBń&\ŹųŅ%£3Ē.,ÕŗŽÓ¼”RÕ9ų‹qɇŻ—Š¢ l“—Æīµ¬õB¬!Š ¤7Žæx˜J—[$”‘g­óźŠ”ć§ÜIÅ'…×cˆpU­ēČīž¶•÷MŖ¢,oĒā7oõ’«bR‡Ü¹(ūu7:õVņŽįĖ—æw»‡{<ȔK#¦ĪD¶? -ÉĶ›BŽÄą’Kp@Ä(5˜^œ”–[Š$½Å5;„aŲęęYæv£ø ķ£"Bžl9ĪM3Ææy{ÓT"Iøyū=ų…m¾r&|ŌMüBZłSŽND9ö||aĻC|”'p$æv9ƒ?%Öw÷ø¾Ć/äX“+‡¹©Rāc‚täDžDŻ¼…6“ _›¼wZµ¾Ł„”ļ|.Še!#GrFō³n;Ł­:"ģi½_ 4 ūnP:W*ŸčŻo†ćfų8W¼RxcOö|Ł„“i‡ŖDźBs—R«žļĻ‰¦źģY½*õUN«Ā‰Ūų¬™æAŠ„”}Ļ«ÕHós&B:5łXßth l~µ-Øū¹ę,pw­łėQßĻG ;ā”,·Ma}|lĆĮėŅWÅŚ÷GkHÅ0Y›D³ŃZ'ėJzŠź, f“[ˆ3øHĢŗÄ]iź–āš;Ś®£nlÖ²i“ōGCMׄQTŻ±/“a)Ā4;œ3'Ķ\“%Nv(*k‚LWĒ'ŁµŻ}²ĀĪK#lKfĒµ©ž?ė®:?ŸtXŠo4­š+s<[xōpŲ§øš²Ķ +…ų07Mf“n;döę>o·šmĒöŚ©•õQłCßɎ^>~SĮÓĄ%ķŗmµŗö¾]’CE>XÉv5Õ;7bŲū#'w…ģoo×'’ŻWmOŪHžž_1EØIP°+>š mZ@Ž†Š¤×öŖ -mģõĖÕo·»&äNü÷›Yļ:Ž”åųt“Ż™yę™gf×æ¾*¢¢ćtąĪā„ƒ—gŠÅYœ… "üoļ “ü=Wģ„)6gbĮ’ä’3Ÿ š&„ƒ¦d}{<“Ü•kĖqĮ<ü3Ėµd‚ĆY^f>SqžAo<;ėž‹>ņŒ“u. ĶE^ċRįIåX(8Oy¦¤0ć\»Ÿ^Ģ'oO!@ĢdļĒ²²CĖXEø'–°ĢÅwŠóż˜B³ā æH52f —Łś«Œr¼X+•Ēˆ5aKŖ .”¢X -d< d-­šeZ“f!bźĶ HÓ5ŚĻ`2Ūƒ7ćŁd6€O“ł»‹sų4¾¼Oē“Ó\\ĀŪ‹éÉd>¹˜āg0ž~!Ėß&ӓp¤ Cń›BPˆ4&F¹ßŠ“Å@j1u’÷ā ö0½,,YČ!ĢƹŠ½Qp‘Ę’J+¤ņHc„E%Ét+7Ū%ƑīļäŠŗJqmāŗ U¢ĢYčŗzÉ6Ą—k—žŠ„k[¢Wķ«©Øŗ –l%I6W^DY6zŲ"/•N)Ī¤Ā!Ą}ņÄ’€·ØOlcķ!āŁz¶K51•ŠjÖ 5ō -ī®Ōł§ƒā#}šžfR掰P •„PŸßŸWÖy‚'œči$ļXÆƙ€™¦ģsšœVęEW’-D|Ķ‡ż›4v¶šŽ‹ŅÄŃC4_üÉ=„E”<“M ‡„Aƒt6ƒ” ¬>eęéŚ\]aŲ8„§z}½£b‚>ūdž±”Ć»KŠS Ī&ē§WWŠŗ®ć˜Ÿf\3č×~h4ć—čHj -šł*əE!zHżŹģv+’K®Jar“…§†GźMć5Ō³)­EIÕ³Īyžģd,–5’‹»×Nj«qEŽ—‚Ń]ÄU3tżd }0eŽGōŒ=¶Ā¾¹żz×: -}ā·Æ e¶ķR/wæĮht7Ō»5jO5n,Žv¶ŸĢę€%’?bn˜kN]„6V”€v­Ļ¦Fa’@9Ńż«–ŌėŗŌ¶3ž’…¾Ć„©R÷ŪÓ -€įMK**ŗ·žhŗ„[ȑ@žłxÉŚÕœwŒ“„8ŅB­z¬‡g#Ż`ļ;IęŃz 7 -¼ŽGXüłĪW²%8ā[ō™®YRVƒŻ:³7Ś^Cp`¢LŌlYO­VF֏v@Æ^÷‰Zc5›Bī¾n4E~¢yę™s¹„ōQ…qKš ¼cŲ›éØYųk‡Ę^lév42”_UĮK¤¶t]żjE½–ķ³ŹtK|±ÉółyFZ›åhy£EŗU• ā°DĮŲ[sʗ 3ÓjEßĖ*1ū–ĀUӟM‘§Ī}m_“ņDżß„Ėu÷Į¾oUš'Ś¾†ńĢŌīłó'HµzŒ«J;Ćķ}V9»©śqó}üš–"ł ļr‚eżD— ż¢Å|_ C拭5@’’–\¬ŗölŅ{Ūo”e‰ŁTŻÜn.|­ŹŠ|6øn”pŲĪ_m¹Ś’X’”Ä÷7¹¾}ÕV)Ü+’Ķ¬v)qėČią½ķÜv^wžåXmoŪ6žī_q ‚ĀR{ŲĒeIć¦Ig¬uŠ8mŃ C@K”ĢE&UJ²ćłļ»#©Ė¶l÷eĆ6ml‹w¼{ī¹ņ§gń$nõŽŽZpW"āą)™2!… !pązĻYĀÆćT(™€±$éābZ’Jx\&܇T™µż˜yųg¤‚tĪ4‡+•IŸ‘ “ū£«ąW®AINŅJĆTi»”ć,Å"«XØ9Ÿr™&]€ēFżšśvpq ZIņ¾H¬0é׈ęJßC€Ŗ˜ļ ŚšE $ž05† ę!Ó>9č©x”E8IAĶ%×ÉDÄøß-¹2ŗŹI¬ā|[ōu”2ēJÅkĘ1¼CEäņŻļ” HčĄ½=čœé)[€T)d /µšxœ¢¹hŲ4Ž“ž‘vŽ{ œ5¦`3®€ -ŖĖ€„$M’&i’ŲėĶēó.3w•{¹‹½WˆģptłĪeŽŹˆ' ¢õ11/€Åh•ĒĘhkÄęA(C“b®q“t’“ ¦“ÜDt½ŗac&Fż Fš¼?ŒŽįżąöēė··š¾sÓŽ.Gp}×ĆƒŪĮõæ]Aų$ _GČp+žkr-„(÷+|Źm ¶ø8%1÷D /0Sć?Pŗ›/Ėc¶†YŌh5E‚81k%Ļ–Ei×Ō—BwśS*RFd1ĀhJRPĢø,¬pµöī.įi»SžN”I@üNo¦¹>LHZ˜Wģe¼Ņ‰Vó"No,‹”JMĶ¾4…Č”K»>X`ōĀōĢD‘@B7ł¦1F8Ń¢»aÆw,ŹxćhōŒYz -©VØ,„"§1;y¹AĢ4›® ?ę°čŲÕRż %‚Ö]ęH6Ę,ƒ “ž ߯]Ŗ¶‹e”óŌķŁĖ3ĖbzŠrŽY ķr1KņĻpz‡ÖĆN!QŹŅsHMįé™ r.w\H‹[ö’:‡_s™Ėrś éhƒ)šUØQś–Z‘cŌ”4$„ -„½š »iü’ń 1ŗ®P®Y3Ļ ÜĆ*ZØUYEģŗē‹ż©…Būš*„Xml@ -\FTę80¤™&“– -×Wd«…¬Ņ%?3`!}¦/MRČZmģŠf°²)·Q£n˜r9‹ü ĖZēÖK0a72n1«\&B‰ńśJ¾‹ Ņ -}Å­Æ&%6„A¾É›bŠŁ¶M±ŗ>ę¦½Š*Myü©’Ō¤j¹·©„††jK0×i›¶Kn¢…kDąōōėA¹]Tœž²É’¶¤é÷:Ļé1p™|Ż–»N6$Ėˆ§I9 ¬­²ų‰ś=a&\VĘ|QéM»·¹I•¹V…%n”ĮTɏ›Ė¹Ø–sĖ[œ~Šx{FY.īBā:įūŒĮ‚ķ7%L1<ÆfĪj׃ÖY`o\ T,]@ Ŗ«ƒ`”lo±”Bšį™£õJ+Įū 7G® -󖷬‘hS­XŸśµjį66Żņ[ŲŻjŖz!Ųœ¬UĢäśQD±&všōN UN4ū »_ŸŁ āõ˜Ŗ @{/×!“ Ų-…x†%€Ėeä%OėļčdŌ„ąē Ė6ēóŠ”äŽF•S „R½H~ó”)`/wNƒ"ZėślCsZӛ–[Ö ’‡āó7Ķų{`Ÿ>»<æ.‡”‰£:B&µ‘[7YĻ—·2YĖóū‘3õcĘ7cM&·ŽBŲŠطՄĘ`Ė,Š¶•o{k”iM§knļķVBč*ĻL æŃp§§½”råÆ÷oŌĘJŠ»ƒókŒ*7KÆö1ōµšęĢ™6Ó§ä_n)Łd y·”s!ķÕj~›ß/B'_n­6¬±×’swK/ĢšiēlĶķX] 9°}0Ē)sµ÷é<ņ¾0įŹ«V÷ŹbłųŁŽ™ćƊsö¦-ÅJŲ ųĻµ&5Ÿ<)X”š-]: W³uF9¦­gg½TĮjŪ@½ė+“Cl\«ōŲ”¦JbSŃ —ČiČ)¬„±¼DŚUwWQœ’ļĢJJÜJ[JĘh5óę½73ūīøŽÖA8™0…,2­œJŖܲa1u¦É܌¢8š\fØ,ęą“Šj‘Ń_Ŗ7®a”• 'µ‚Ć(]Œ^рVČŁŚ@„MWÉČućč ģA±Båģ EōšÉrŸĪaCō8?—¶Ė#­t[Š‘ZmnaCP"Ļ%—%HE•'Ā‰ arV–ézgd±u […ĘneMõV,%] dl<”%­;ŻōRöT÷fLį ±ä7³×pHœ4źæŽĘG>»;PŚAcńš>ĆŚ]"VÕ„*óŁ½ŗ§ÄńŗŃkī/ōf? „ćlžl«ß†aŪ¶3į Ļ“)ĀAbxNĪ&éü‘r.U‰Ö’[_iČćõDM¬2±&®„h¹ƒ¾Q~ˆEkČqUL9ŪC°ß¦gÓŠ$}?€l¾G£(…8ĮI”Ęé®āÕĒåå -®¢‹‹(YÅó–pŗLĪāU¼LčmQrĶ™Ÿāäl -H–Q)¼Æ ‹ ¦’Å|ož<-}Ÿl™ÜČŒä©¢B”ļŠų5ØŃTŅrk-‘Ģi<*éüPYNżIŪ°%Čī[†āņwż„„” ©/hĢE†žÓ°æß®_ĶA†Į°Ö\²R~?Ź¬_ēīķ_ƒš‡ė!ųŠĄ/ĖĻ„6Źč–\󈟍&+Ż.ŃĪ_żŲž¬Ņˆˆ³d’”ؚŧJŽÓŌ܉²yž$ E÷J’ś’ä{ nÖä l•łKéęĘ¢;ģ€§= -Œ}B'ĒÜAa;ˆ|É>Šļ‘`|䓃’`Ćh-ž“žKĮńūą;VaoŚHżĪÆE‘€ˆāź>¶—“4 *ŗ -Ŗ˜^U*“Ųƒ½Š½ėŪ]ĒŠS’ūĶ¬½„Rõ ;;3oŽ¼óū›*ÆzŃÅE.`* „D+'¤’*—#ą÷ä°Č¦©Té5Yqė )„µcrbæ2Ae1§½Ļ¤ }Äzća¦ŗV©pR+Lāéč'Š -Ł[(µi¹®mD™A,Q9;ˆ}ųłb9»¾ Ab’TŚÖ4ŅåtGZh“¹ƒ …i*9µ(@*:(=v4˜ “r”‰®vFf¹Ż(46—å[r)ń4€±mą–jŻéŗ+å źŽŒüIøäßĘ/a@Ų鬳ž _{ļRģ@iµÅ‡č€Ū+Gp XYRØÄ{wÕķsĘÆ]½ę¦š„€Ž^įŲ›ß¹sÕ«(jšf,<ą±6YJŒ>³óųę>ŸUÖ[×ŅĒėˆŠP%bMX Ńp}£¼Ecˆq•ŲŪ¶é“‘J?¼@“ ߣ³I ³ų ŽMāY<‚/³å‡Åē%|™ÜŽNęĖŁM ‹[ø^ĢßĻ–³Åœ~Ma2’ŹžĢęļG€D„ĀmeøB*™QLō0°Zŗ>Ł -¹‘ •§²Zd™¾Gć§¢BSJĖ­µ2%y”ŅyQYv}R[˜’·D÷‡āyņ÷B¢Hź3’¹Č¢Č›Āüz»~¦? -õĀ”ĒĪŌ‰ƒ&—I)n¤ņŅĘĆń &®m7½0QÜQqLT”ĮMöū?jŒz~‡<·`č*Ż›[Š½z$aš…šėĀĻhAĀaÉ{$!Ųߎ §1b7`u©lŲY"’YÕkāĪ±h·ĢėŽ©Ŗ.×¼Æ~’B*w2pB«ĻŽź“£äyµņ;rxQ““xež—DāibÓzęHŖ °yŽmæYhé;IīEQū–>Ī^ #ŹĒ\>wt‹PvµŸ20ÖSElj•xõ­VI>xČ—]öįØ N'/Gm<ž -ms[‘šėœwź‹«ƒ>ŗ†–™»Ļlųń„ķ[tµQjIšęn·1-øVļū%NODM;gē¾¼cāŪÓš\¶^${’Yšö(ķ`?³4ĪÆB˜–ŗ~ė°R¢Äžå•oõš8ćjeŃ­½Czø܅'_7ÆŪJēwæ/…D¹jĻB˜ƒ£ĮhäŃP$ņ×)­%— śū@EtQKt¹¦'wŽ -ä^.d ĮŲšH’ōįÓ/čńņŖ”[L‡eū›Ę÷åķ?"×LB|ŖĒ=!ƒ6c菱āŗTĻŚ óü«”Ų’6ŚŸyķ°Üśß`$÷£÷ęŖ÷/•VaoŚHżĪÆE‘€ˆāŽ}l“4!*ŗ"LÆMOZģŬbļśÖė8ōŌ’~3»^0ä¤ˆ`ļĢ{oęĶŲ|Č×y+8;kĮ\‰”C¤¤aB -™€Ysą?£O¬ą3ž«B„7—BóˆžécE]‹ˆĖ‚Ē`”ę,ĀÆP­LÅ4‡+UŹ˜”$t†įUš'× $§h„!SŚĮj±,13¤.#°DsžqiŠ>@Č¹M?™ĪĒ#X!WŠEįā@%ĢĻˆ*„ļ`…©X ‚f)‰2K„5O˜ŽIf¤ņÉŚ€Ŗ$×ÅZäˆ7')į•'SøĵnTYKiØ®‹Ńƒæ0Iž½’:x€‚Nź»'Ż÷6:cŹ@Yš]vąĻ ŅEbYž -&#]«Ūb ĒŪ:‰ZRĖ€Y) VĶcĄ EÓĄŚ˜ü]TUÕg–p_é$šƒk¬ģ$½AŅ>ę‹LyQ`µž)±ń1,7Ąrd±%rMYE“²@•ĘŠĖ¤Gх7A³M»¢yŠ(½yĖĘlN†!ŒĆų4 Ēa¾ŽēŸ§_ęšu8› 'óń(„é .¦“Ėń|<ąÆ+Nn)ņĻńä²K†Pü!×$™ -Ŗ(~ņČ-uŸŠœGb%"”'“’%uĻµ‰œėLŌŚIĘhLkŖ‚B“ł)łˆå¾£T4MöĀ}ķ `čśmĪ’ °·ü¼¼]ĻłS-?ć”Ńed Z‹h 1_ ‰ÖfŲ_?ßŲ‰ƒõ „ +żōÖĄf.ćķĒ§õo Ż –#}§ė;fÜ*Ā ±!ÆŌ­ž.pDp“ąŠhHč×Iū›„00æ½-ʓłh6^ĆŽ¾o½’IK^Ó2éąĢźŗ~q÷%Ų£o[ģߎ±iŪœšMngł!6•rįg.#„5, ›]¶ęŲgüxĻ4ŠLÉdR^.Ń@ģq9£Eć–9‚®DRŅäk|)Ōū|ƒI’Žģ”*ŪMųjI>śq¬ Ŗ™ü.yõœI©śŌ ×»yI„åźómeŁ=°enåģQ9’‘3Ķ²Zˆƒxā–Gxāv䱂¬JŁēībyńŲŪ%ļķ'‚®Mį’>§ä±7ē¶ļ›ƒ›ŪR šŻ>8“‡28lüuŌ“7„–¾cĀN@TO‡wžīɈÆĢoo÷¬:eZ³#Ćŗ«žU³§é.>ćŁ÷Ū†5ū”ČŽł46K§ķ’e¼=8ægiÉ»‡ˆ‹EĮĶŁŽOģ;’:QoĖ‡\icØV -Ś|į®ł4K.ąĀå3a¼Š±•v]E(¢Īšq³Vų:“ę„ń)šŚ§šļI7Ÿož0¦“åL68ĻÄm8W²ķImūņĢķł‘t£m¹-JĒ”śĪz°†{~j;uōßmņhūGoūŪ[²y­é¾öčzžj}8ożYŪrŪ6}×W`üb;暝>6m՗FÓXJEŞŁBĶ‰lŖ#ƒ"•+•0”ö öWLūF÷—ćsŠ•żzįė†ōn ÆIM`k°¼·Ÿc‹-B#ĄWŽo‘tq„Į‰E=±”^Ѭ±6}Ch“ZO‡»!ĀĒpG“¾A=5D˜ Ōėį‰bQP6 āIįĘJ`{ U„ļĖńūĢńHƒ`čŚ-Fˆ€@S«žš"(ēZ [¬`|ĮEG±Č\HŪQrō<~Y›.“ŠĀ4#Y7Gä‡2‚Kœ“ķĀ|źśiž…¤šI¢ ŃütYŸå Ż9£Ā -[5HĒ8ß»aų6>ģéĻ¤Ŗ’&šŒō$ä6ÕŁ -²²ƒP Ō=‚j w„5ƒ ±€„›ČšļkģŠWÉõē=ę.‹l±„–o‘Ā7Ü Śzb„ō ¼>¶ŻŌćiŁ3Ė\Q(i‰ÆųŽdĮģŅf] 4žĒē`Ŗōö…Æ7ķużš,1\Yū:"Bž»QX¤!ĀĄØņŽ©ĮxfƒĻz]BÆb‹;o*rLąĪŠäj»b˜{ąĶ[čX·ķ *„xk¾Œo„­ĆömfæX&ˆß7½¾›9ó֍JĪWĮKżĶŁg4ž~Q;«µµŠ‚ī÷ŽėōQŲ?$żŽƒÕ ¬?ēƒž{į÷aģjw“ęÕö‹aøĆumŸJ{óģ «vm‘bH=‰ófķ qĶIIž§ōā)†Ņ<.÷Ā(õ#£Ÿ±Ū„Į gpļ†w)Ø&Ü7½3ĖY €†&•WƒąśÕ©MŽŁ;Ŗ›µ^Ł.ōs}!RŚ*xć£Rk“ĢØĄŸŪ!wē¼=īzlŻ¼u ēļG?ŒžķXŪn#7}÷Wp?“²“Č£'öŒā "ģ¬Xš ‚ĶĀ Z”Äu‹ģlÉŚ’}«xé{KĪf§˜‘Üd«Nŗ°æ’nŅ³Ń»wgä¹ē #±†rĮŚ˜ #ģæńZ&ģŸLd·œ&rMā„j=”śÄc&4[#­Ä8„1|ĶäŹģ©bä^fbI —‚DćŁ}ŸĄŸL)JKE¶R¹c_d$N#”kÅŲ– £‡„Ģ³ź§óÉĶY­(æäŚÉ{n6°‡k²—ź™¬@].9MĀ<ŲZCPP±5UKt3–éAńõĘ¹Lé Oį¼9ŗ2»Ęh§8 ¾dę])yķĮ/ ]žnųwĮźłÕ^’½•ŽŅŅL³B;a/1K ˜ †mӄS[iļ]~Ųų‹W"2B­+D®ŹŪ5(’Ł“^ŽFūż~H­ĮC©Ö£ąāč ;Ż]€ŃAę³H˜Ö€ÖoW€ńā@h -VÅt¶&t“²+ö -ėJė@‚r˜ -Š‚‰ązyĄFmŒzć™Ģzä‡ńl2Ÿ'ó>ĻÉĻćĒĒńt>¹›‘‡Gró0½Ģ'SųėžŒ§æ ä?&ÓŪaÅ^R…N€„eĖŸ‚ Č'²˜Æx ī‰uF׌¬åŽ)›)S[®1“Œ\=¶ÜXRimų²ä#ĄżŒŖ|6Ķ„L¬ÄĒgŹhDżk ;]Fv)$ĀŪĆvŒ‡V%RLĖLYNĪBź—ćø„Ļą¦"ńFJ„HÉ- 22C· Elą¬$ksÕe:„3MčAūķ‚›Å&&ų*aõ€.cĘw 7ļhĀ—^„%,FeBĢČŪŠūĖKēĆ/¶āĀSTµĮŌ(üĄĻ­åģ!µį{Ī’ŽXŁ@Īn­µ2¦¼īÖĪ¾žARüäqŗf‰!įiųžø£P.ł [ś'#ū*i*pżÜ ¾očżII`®įr«RŖ=t)M į+·3r[įӓ½ü¾ŗ&"K’Ai13ifp­ŗŲoZx£5–‚ķ\h‡ķ;~Ė˜öT³Æ,š®čFČ³!'I‰:\•2f£d¶våõÜ{DRŖč–”ŸŪē֙ā1r.s/×ēŽ·z1…żĖóĻoˆśÆą¢ŁČå°«æĕwl8¾üńKrńˆŌ°SCƒź…č˜’]Č+™*ČNņĻ²Ō²Ź„ĶKņō]ŪevŌišąm†\Yv¾=čkĪ sĢń‹ėąūUŠś¾±#×SؼņJ?XĀ1#ź“Ė\Ī©~mōŃ¢¢ _•Ć X)ĪvĄ‚P¼\ -ęhNVµ²”ĄįČ¼<)™õo9pĶƒ(ąĖA›Ä†¶ēXŒib»K=>v (Y-Gļ©., .XłE­dTŒ?' -ųūž0ļŸ‚1ōB ‹Šr!ŪM÷H˜©Ā…)¼×vpp:ŠxO„õąܳsg‡,l.ä³Ī³³īók)µ)¦ƒ=±t[™mJå†ÖŲKxkĮFg•7±f\Ų>|Uq~Å4Iüä ‰Q÷‚įȒĆ[W·p…Ź—S@”Ø+b9šG)µf¦ƒMąXIyööó]Å~üXk™},ŅQæ(ÆuWĪī¢īmjJł3`ˆ¶`2?)åķēķņvi;iS”÷ŠdŖŖ 3‚6|V‹7/e÷€pōŲŻżGo„pAzJQyuĪÓ«“ ^«ļ}0²8×Ę5Œ¢;Ź¼0t¦N©×”“£2.RČ0Æ&ol³łķdź}žžfžųéśāö8CóöÜŽ†Ą#f¢0¼øö\%½ÆÕ>tq ÆæŠ^A:øa0Ī ¦ē{-^®¾×;?/BW‚šwžĢ8<Ć#učĢgČš -./Š ³Š*«%ņCŻmxt±—µśn8¶å©5¢ņø5«rkzæŠ2n°Ÿ#>µ*ŽrĪD$^Ƃ|i2ßØ4r§:&•š…bs,$+ž’„U<ėŌüĀäźå%6õOiQ¦>å*×v’ɢܮž‘xWŠe1łWƒŃցƄ -4¬,` K%ÜoÉ!ŸKB&c­‚~ ÷bČÆ-]ę÷9§,Ÿƒ3UšŅŠ “ųŹŲ 2µķ;/ƒ¾¤(vUÅģłČc‘r…Ģƒ+ä3T€·T’ö÷IܙįOl=]}Ą_¦ -ˆÄ1ÓśH‡’jD¦ŅŲ÷ayĖķŸ‰«cåN†ó ”āū¢jčŗ8h›-ł„ķ0…Ė -±’ł÷Ba”1ļ»ńå‹m`µ½ųź)dųZ@9;q=€Žj–“v~{§|‚ŠóÄ^ø†ŹWŹS¹tķĪŒjG/DžUŃłļ¶²U)Ž†­įÖI®ąk1V#Ė7ˆt”Ėå\ ±•ūqĽŪjˆŸ ėOł»®Ī®;©ń_kb›ĀqŃŗźfŗ¼")™ż§eĒŪˆŖDŌѬWĆĢķšy 曬ŒĮĶāeÉe£³Ś<ˆź‡†—Xžc·č¾–ķ°d@»!\·'oĀO¦ĪmÄćÉ]-nõįJµįɾ6kY½ÄUsHYĖZæūČ^éß1¼z­J:|^OĄåē÷m‘uoŗžP`ż‹“æ¢i?Ńt }Ū.ŁŠBŪoļ7„Ŗ §zĪq„Nv(Ļ0Ķ}£®’_ę£AxTŁķzµ ¤ł׌}j6š‡’?ÓA ūp}ö?ķYėoŪ8’žæ‚'ˆ](öį>¦MŚl’āŒė9½ŲMQ,-Ó6/²Ø©8¾"’ūĶ I=-;Ż-īÓiŽEĪpæyŃļŽ§«ōhųęĶ{Ć>ŹX°H%†ĖD&KfV‚‰’DW*Ń*’Ź…6R%גĒjÉ¢˜k=2¤ü$#‘h1gFÕeŹ#ų˜Ø…ŁšL°*Oę©Yļrņ±Ļą«Č˜JR«Œ­UfĪä,7š"¶_fB¬Ebō€±‰Ä~|;]Ż°ȋōs©-°‘f{¤f•=²°āó¹Ä£yĢd/Ö$fbɳ9Ŗ©t›ÉåŹ0µID¦W2…ó¦ØŹä£F[ĘžXŠu«r§JEkgŒŻ#Tłoƒæ²l@¢Ą­ż·D½ę[–(Ćr-JīL<9¤ ‡ŠæøóåpHK>^ļ¶}8$–1­ņŒ05<ņį_ lō#׏'ęģwżØ Äy‹¶«Ü¤¹Ń<‘щ˜=l*`gd%„šĄ±L@YÉØ–#ü p_«$Ž"ŁÜ įĻÖ@ų(XpmoĆƒ[ŅLE½÷ņ³'ā ` Ņ‘9Ām@.Ž -ĀAŲƉņĀxŸ‰’`C„¢ų—X€ä6] L§ÉwpUņŲ™0oSRįeą£źŠ@P°4™ō™ķ”cŲ±J @–_u@wŖ ŗXߒo}6XŁ55ū·ˆ 1„šMc¾õ•£ä=<²˜ź¬%1Jņ•=vķčūŃGŧĄ)„sęßśĻOŹ‰|s÷fHŸ AĮyĒ–šm‹ļgk čŲɔgßv1MKās»³wäM8_š÷łKņ8+‹dH\«/öŪ^e‚”ˆM„„wķ³ęĀ,3įżTVk Ń»Œć -ų„öģ<čĶ*SłŅ–.–ņŒÆ…Aś)½·Ø(^cŌøP.ųŁć+ĮŠß\¹ ½ž oVj>h¹ƒųw•5ŸV\öG’ž’ņLž%ģIÉÖņäe¶Č“ˆüóš dÅ<2½N”Ć× rN(a}:ģ{¤cĢV§ŽēžóŪ֎‚OÉņÜ1}O 9 JÆĻĪ -ZĖž„Ö;²dõEÕÕ>7ĻžO<–sĒ…UG‹Ę -[qĄr  žo "÷‘Ą"“łŁ‚„eī<°³=7…Å#±¶ó˜*qIĪ‡3H¾;ŽŽp]J<ŲėdņIļˆ²×tŽ;ĒyĄ±’‹³ś!¢żIK”:Q»ÅvVŚ -S7•^©<¶½”6Ėr*½>V¤‹uŗÕč†ZRŪŌmų “õĶ¾č"M4 žRÉ1c’Nģō8•JZ…  (NZŃJåDlē·ūG.j*csĆćŲ(™M¬ĶVĪĀæMv3›1];dˆŠšŒDӑ»ń¼¦Ź XÆä"}ō‹]å~|,Ōź©eŸ§{ż2k½ģ ¢®Ų¹¶UDW“oŃŪŚŚ?‡Ģ©uY_OO BÓHäŚĢ:+ˆ Ļ ß5ü-+©%dŅ<,ĻvĆI# ¬“=ŸŠW^lÉušźÄ‚ćźūi ¢‚›l%<Š?qćd×:•‚W ŽZßv9SŁŲp³A+­'ÓėŃŲéüījz÷éāōz?B‹>aw„éł.Ŗ²`«¢’œŠgÓ«aµ^%O/ ģ`ƒóÅ¤Ń5“- Xy €šĻ µ™ĢĢŹN/ -'NhR¢j¬T@īĘŽ_[*arģcqßŃ łœ§½–·ī„ųža‘żą‘*œ«择ūSō -ś‰ ‘7Źn¼ķ»j!ø³>XT0šS3ł fGßxPcŲBźģĆ,P[󹚽ÆeVō¦yVĘ\„…īxahØēTɊŒą¢+§`ŌD­YŹę/ģ‚į5AµīĻ`·ö|M;Į™m¦Ąxķćš -x×8QR5v„l³’ŃŖģ)ÉQ"ŌŬ÷¦mĻĶŻA¢‚fŗœōö* AŲŲ“+x{ń²…ó ßEj..ü·į}„Ž/hčÆ\°Žv˜ō Ė;ž·Ā”G­sȂn^A o~äģ_“ß~Ņł!™²‚½Ö ńšQéĄ`äīqŽ½Ūm¶b~"pė]T06r„¤{öĪ%Ä|āWm¦«*¤­įŖóĪĮѤ;o ¶>/ę*QōMč±ņ¬:¦±°©sXŖÓ5{A“Ó`öšįémĢU˜óę©­mµzCÕ¦µ„ČŹdł'OS8āŽoÆW@{>s(kŌ$gŒśŪ®£®t½düā“³³«ŪńżĶŻōįÓķכ»pĒįµWųœ@"9Į’“ķIŲ^MŌ ŻŸœ$Õ²U[‡®}&ņAh]ŪļJŖŸżµęTĘ£Hh½g‚ųR˜'+C?ŒmRµžŁ>©Śi×t4ųĆĮ9tŻų`ōDc¾Œžē~ š ­ø³ćŃ=…gc/Ę1AI#—‰ŹÄ;čzz IvNä’‡G±}ĻŹJƒ(ō%ÆrćÖŻnŌ'†’ä×Ļßv µ‘eÆŪZjÄ -ž>"`ł ¾³„Öuõ!¦K7īø»ß&ł°~.~ōčģźG œ`Ż2õVU;óšł)^ńž÷Ńń: źPƦ5›ĄÕ0ÓC'“ßmTbSŽ -Ÿµ²ÅAÆyØ’½ÜčŖ°Oó]yU„Ų-L'ŽéŌä;‰š©›Ŗs[|ņ`;–j}› ?<Šļ;VĻpÕlS±c­ß}dPł‰ęĶ‚\*µŚ?/­73ĄōćŪ]¶WūŹĮ®/łæGééšØ5ŅĻu”krŚĪūӅ”.Ā”Ś„aĶB« ¤i•Ru).Z-‚æ3Æķ¶5›Ze~0ń’܇zwųé¼įĄtļ/Žž ½Y[o·~÷ÆąŒĀ2T©8v•ÄudT8©XJ‚" j—Z^-÷p¹–Õ ’½3Crļ’ģ6­€DYķÜ/ß ™Ÿ_§ėōdt~~ĀĪŁŒ TbøLd1³Lü\«$S±ųM$ł[Éc½+žĒę#eȍŅ,ˆy– AJy'‘d"dF‘„«”š5W+³åZ°•'Ą&UĀĪ®ę7}B3•äi„­Z.s[‰ŒGZˆHL6dl.‰ŸŻ.¦×¶Ū‘?”™å¶Ņ¬Ffl«ō[(†Uó˜É~Ų!ČØEÄuˆn*Żi­ SŪDčl-SŠ·@Wę7Ž˜Ģ -öjĮםŹ+Æ]0ģ#B—’;ü‰2õÜŪ^’’ø7|ĒeXž‰R:OH ˜ †mŅXņ$ nē]”lüŻ QKL!ćä -S«*ć¹ńckcŅ‹Ńh»Ż9Ų§éā×Ū öéźīīj¶˜NęģöŽ]ßĪŽNÓŪ<Ż°«ŁļČłæéģķ€ ØO©F'ĄR‰a„ž¼ X-.OY*¹’ø—D9‹Ō£ŠŌ#©Š™aj302„ņŲHCE•!kĖ7ß%o Ü(Źu×B©˜8Ž<ŗJ8TåĪ£Ńˆ^łFx~ŚÕ!‰ÄĖT®©¦F' -\‹³Ē¢Ē1]`€AsPŹšŁ„ƒeĀ`õAĖęL`?‹lĄB±’ dJćr*bŪÓ('Õ -jvCj7HŲ0Ą_eh‹ Y ?ō‹< ąw”BC/Ä2»¢¦D«øÖä]”]>“OŲRų¼ŚJÕ"ęO$Aēņ×yļā,–L Åxx“&"¬¶é€céH™žN³TAq,ć]E=yš¹rƒjż8¹[ܟ#Af8ĀFŻCXeÓUį4 X†įBāś‚'ŁCĀKuś°LbNM2Ā”ļäT •Ÿåq ²a-“Gł*ā`Ž‡u6ljŻ©7 Łjf6čebŲi:‹ZžS–£-Åb ]\ų°Īngvę4ō”ć_,įŻķ§ÉŻ_aüšžżänH]eł¬QŠ€ä¢ŲE_ž|=A;Ø]ńsĪŽŪ˜A1’“’~óȵĶ˜ūeDße#DŲÓ“d[Ź³ļkĻēµgŸĒÆEPŅø;¤Iņ8®”Iģ9‚LÄ«z¦,y’ņ¤éŪµÜ„”Dl-ž„M„²6u _eÆ;‰ä£HXŹ5߆YČ© ‘•eėÜsgÄźšĢ8“Fl2Dš¢ÉVZm¬0|ćå@³&Eh’S¾MHEß÷'Jrf‹ -ĐÄĀ(Š!†ńdÜ“Lc¾C(ĢŠÖ#żD2DI”G+YxW +Ž.E•Śå¤xՍ"Us* ZŌƒ¬÷)@āU¦µ”X½,gāR¬p ō !Ķ°UÖ¤ģ%PTćŪČ',}ļ_'Õ`D •Gp}Ś•lZ˜\'ģQÉ°Žxł†5[åI@{šż=æĪsÖrg\t[iėŲvWĶšqGC±>éūZ“į)–_Ā©Ke—MĀ"8ŽŠ=·č*v]łlIæµZśŽbĆnUiĒ¢@mę+-“~/±ktjŖęZQī{ŹĒ•“f÷Ž@€†Š·^3ŸK˜”~,7->˜gß×g…ŗf~œŲ(”B#[Ÿ×„ČĆQ射 [>)ŖjķćčA¬šīšRf²v„y({4rGŗJ¶ėŪ\'"|÷ų[¤ÜšD¦yĢM‹ø;”<Ż}Kłr<³^żšC³ž3¶ķēŲė"*I¬³¹”fÓę’•Į!.X³³Ž6Ś'œ6Ģz§ÓŠrQ£Ŗ˜øbm§Ē/É¤ķå°Ģ…§3r<żˆœN¦o„AČ@ū’*t,åQ¶,į)Ų€hńyŅ)‹łŠĒąžXgtĶČZŽ0eK%ejĖ5¦Vƒ‘K€Ē– *¬ ßB•¼‚p_£(_ds)ĖńźĘ#e4¢€ž5Ą®G#ū*Āקķ>Z‘1-3e15:”VŪ˜Ź÷–!€K€—fŃeß$t–Ū X …7UŅ[pB\wv—;Ąīߊ^“…KP ”%k~ƄWŅ4ŗd+.-Ą"‡°“²ćQkŪJA==‰ó¦ēź&|°)ļŠXP”w }X¶å_Ą¾'`('Ŗ’Žø/õ5>. š ¼ĮUĘ"’.‚yꎎ .O/ęWÓóé)éyµ}€ż£%¼=’pzń-Œļß½;½Zh9 =f¬`qŗ~ßɖÜ Mæų9$ļ\üøƒū*ü}uC•Ė­’fd’BÄ IJsfBʎ“wŠœGų<~į)śƒ‚ĘĒ;ņĻ@#²$”…„Œ!š%«jŚy’yĆ¹Å|a¶#’ų @ŪÄؔ1™Wį|;ļ€ģ6<Ž” -Ņ¶F'Īפļ’n&`Ēƒ1¦ŠJ¾–źż"H镊¬?$“•…¶p@>nų².œ¤zļ"Łc’BĢ®#h£Šź±hKåDRŖ薐ƒ•2uūA A\c±Ó4ē~ø`Ųüq‡p# -­ņ”X°ī0>Z8&øÉ1h![’yĄč»—w/`ą µ”X\ø­ l[5H[7š «³Gżŗ" Ś¤šÕ¹YÖzT…ÆÖ¤ąUӇ‚G1“)˜äĖjf cd• gķՕåUYlzMß…cW]Ę-EśVĻm^†O0¦Ļ^”"4.«x^',Ż ’Š %ƒį]£–/l0 ĮnQ«Lŗ0G‹ź­QtÜa°œ{±.ØųL{s++f <`£‘®ĢN¬ĢŖ^gß½i }£—««§ĮkąāŹuŅ@8hIP’”@RŲœŃ·Y6y€‘ó}£@ń‰Ķ’ŃĶ Š8–ī`ą4„ō†Ŗu”ĻP¹¹ų!žć’ą8rKO³„šq{ (YŚKńr<“("OŸÖq’ĖŲ•šgƊ(e²ŹVŌČ]žŸ† Ģ”^KŁtɎ)læÕ¢¶ĘQ…Ŗd“#³RPņūłC2ķŗsæĢDīī‘é½īįŁźQ¹Ńx *†gŲ‰š”½‘ÄŖē2jąĄY[Ų³WšŠ}q@fÅ`dĀÅu†U•„pćĪ;ÕĒ ‚č å -×ZŃĪČ{”»fęĀZ0³“½Žöõ"2“{£\B³‰FQk’šØ”½Ntæ$łt[}{÷9"GXyĀßkēl¢Kģ¬{Zūō„ms?…E„Ų_¾e5ŚGµ \Ś §F‹ēZō!šä¬f£äĪīŅÆóĮĪ©4öJęŌŽ3Ųó…£ßšńgÉ“=õGmד -(läkūĻƒRŚ«yŽŚ‘ątm)]*j _Ł…ŠmžSEĄē¶¾dĆdWć‡"Õ°æk0å˜ĄĖöćAQ™%įµ -·ūūĄµ‚ŪÕųZ¬PaWq¼Ę‡:”[Ū£‘V0)3{+ ØX³GĀR7`9؇“Óbµ ¹ M;pŹGČꘚĄĻw”š~;W4Ńe%ķŹ:A]š.HdM‰źƒ?woŠś®[¦l~&īöXĒ4”ź^—q'©¾mŁI~r4œ™ßŽŅ @GDZm9Ó“G¤eOś*JwŁóæ…ņ7B…‡ßśĪŻģ»ū~Մ‡Fž +±xpxŲIųÓ6 -{ø›+wcRiąš ŠDāķłŽćå8ā#k˜ć÷N|o‹m6W×lžpmtEõą³ųņÅĮXmo9žŽ_į‹*šT!¹»-)”Ņź¢ćR® „rvÆ{Y{›Ō’~3c{ߒ¶”• é®ēż™gfóāe¶Ģö†‡‡{ģ]ČT°H+Ė„’*av)˜ųiet*ž-„±R«7’§:ł‡gœłĄSs«s„ܘØAMoe$”1³š“œf<‚©^Ų5Ļ»Š…1ŠĘŗ§Ó‹ƒ?EĪ“( ŚV:w®är^ śŌid<ɅX eĶ€±©¤~r9Ÿ³ųņ±4NXK»„3Ņ°µĪÆŁTń8–hš§L*ø±"GP0 Ļc =ŅŁ&—ÉŅ2½V"7K™½†2½Ī§8˜…X7ŗš”Ō¢öÉč³ Cžsš;ėĀźų§Ž1IÆų†)mYaD„‰ŪHdÜĒVY*¹ŠHŚGWŚ?y%zŽedœBazQ?ĘøEiüĒŲŅŚģh8\Æ×Ntž CˆĆ·ŁÉōü98dŽ«TŁśVČr<ß0@Hš9ųšņ5V -E/Ö9d\%}”6õ2UI .Bčõ6N5źœNŁxŚaÆO§ćiŸ}Ļžŗ|?cOÆ®N'³ńł”]^±³Ėɛńl|9æ.ŲéäJž=ž¼é3)Sā6Ė1šTbFE\ĆSšŃāėd2ɅŒ <•<,Ń7"§>ÉD¾’KkĄÉą±’–@ePt+¶Š%Æ Ż×ØŹwŲLė”$^Żx¤ ‡ŠŸÜy2Ņ£Š?_¶‡pH*bF9ajøč ÕŪXŹĻX$rB¤ÆH-ŻÖ˜Rj~h(ÜMS²O‰ü®«ė{ åūŸˆ¬!x Šbœ%ņFs+°mą“aÖPĘX,¤Œ€؄ßņȦØĆ5ÕīĖg:MĮ0ü]F|Ēbš{Œ§©^@1Ŗ -ÜńX2ĀqĘ>Ķr @±›Ą°Ti°ĪsN ŗr”Š¬ĀĮ,ąRD×Ų`b|ČAk$ qČF•kĄ/ź/ą”WŸ4@ˆ½¢ąĶV4-ĻAį-ĻŽn˜Ā§§ī–‹/ÕśŚPĪ‰øŽšĄ‹HĒāÄń \j·üƃ0lt_śĶ'J0z¢ŚOž€»e~OŌAł Gž KW>.‘R1ŽHēL+ĻłX Wf Š†įQ¤1…X¢źIAōtiģčŁYó9‘¦Ŗ0,>/ūŖĻ$U ęŹRąs5ƒź Ģćƒb‰ń˜Sl‹[†›&8؅čŸ@PÄNN&ąÜ%)\%=¶_„·‘jR?h*]É[psZžŠ›šŽø›µ *9©,ŗ ¼ćMĮŠ#”[˜IiA•³¦ĖŠ 毇ŚāĪrx@ŌŃ²^BH]Šų—éBE.‰œśSØv¼i䊭 Aś)[ƒ›“µ÷ אNå’c.żFgČh­äūhzćŸ/·ÓPeL «BIJT¹'ąšUżķ„ĮY«č%mƒŒŪ™|E1ÜOģ÷ryŲ†ZŠšdŽ.=ÄXÜāņ†\‹ĢįŃ6(Ś21¦?č¦"»Ń2ö÷†ō™sŲ«Kš°Æ_ÉH^D¶ė[·–„~Šˆ©"Mū _GPótŃ,ż k?ņ®öpK€Ė1±Ū@ Rś½³0Ź“ūˆöē'ž¾ęóØ>ųŹŃĘń^y’oGG˜vFÓ £wL*īöŚ¼{EIDś\Puƒ€uH€żeŖŖī™ŪG]g4·žV5ZŅü¦Zó$Šq@Ł" óé) ķ†”·5Ū^–mˆ8‰­ĢJfEJMŌ<¼;”"ė–ĘŚ%†“TG£ėtŲ³g”žW捲¼xS^ŽĶ¦Ųqyä®üfÖčmŗ£õ -ߣ;āF“0LŹQć”0ÄĮXV°«ęµŠ·ę@Ę×ĒY£EźQk@±O³V%ÅgÆ L ³³Ģ 4ĪgÆī ė±—;ļµ-:µķ.y9üeD ¾E5øŚųtdÅöŽ'0“żē›j ąM`‡ĒhčĻ܋DQž¼±%^j±ĖŒĄ×P†ąóD[śżīœ~”¢eŚ½„Ś{Ķų=ĀąųĀE6 Iœa@÷'ߟb‘WöĄŽ.čĒ‚œ«¤6Md¢`D>ĀõõÜ÷Ū)mwqÕU’=ŲQ€QgÕDŅ|u3aĖ0q禮}·•pQ^i·Ż™ŚGbķ³¹ŅŁÕQw?Óў¶CõmWM¤ŸÉü®žŻž~ %4jB§Ā4{y²÷?µXmoŚHžĪƘCUE" -wżŲ”4i^tč*Ņ “UUUŃb/fÆĘėz×!\š’~3ć]Hš^‹ŌPšĢģ3Ļ<3»ĖĖWéŠJB<$ć°«-ā/IÅŲÅ3Dcōŗ„©ī>ø*ė*kÖ“yoń"i/Į˜m;Ķź¹Hķ7ÜÖēnÆ =čģ,ę+hƧŪśÓ»ĻmxĮ īkCw)V@ A Ł%örgq>#±Ąė żqéģż{ī“†-] -(‡ę®vdē™^ņ9éµ0ŅćiĖ÷Ł3¾¤ńU²°÷/78‹7|e*—Ā1J[ņŒTU”ąų ė×id¾½‹\]įe‹Ėw¶]u:ūT šy[#2Q|bzˆ« 8»ŗ¶TŻ%åĻ—EmxśĒ…R˜›*ė6)m -ÕąŲij]Ļ›Ņ 0æźNš¢ö¬Ō½2W…:«óf41FłöŌĖd‹ÕKx¾a;”’Æó’!]hX»€P"ÜBįrN®æī6¾™āœür°…1ŗ‡Ÿ@ą‘ń^~hæ®?Ż²_’jjęÓįˆŲäįĻ©:„‡F%_Ös{pŲńČže{ ė'YqŸ« üŒ wAӏeKEæ{9¶o8Ū|įæś"WWņFk6UŃ$·Ś+ĄW‡­’½XmsŪ6žī_±ĒńudW‘œŽ§ŚU'¶ļ4—‘ZKM'“ę<IØ)‚%H)ŗŒ’ūķ.¾źÅNšÓLb‰Ü}°Ų—gųée“ˆŽŗ§§Gp -7*ąė0*Tį’…ł_’ä/©4‰Ņį•ž7‘|'5‰ŽĮ„1Ä ˜·Ź—”‘SH4C\FĀĒ?#=KÖ"–p£ÓÕ -Z—£›ĄŸ2JŅF“„Ž­±š¤XDóXŹ„ ÓIÉšƒįø’ęfh<éO•±zhĄZ% ”QÖ:¾‡B‰éTŃŅ"āƒ%BŠ±œ‹xJūöu“‰Õ|‘€^‡26 įzcŚŹčĘc,°[÷ŗŃi¶•Ņ®3g“įіčœA HÉĖŽz'¬½u©‘:ČO¾Œ4 [F”ĻŚŁīņ5ŠĘ÷ˆžP AšV@ĻŹb Ņ¦‹$‰Ī»ŻõzŻlpGĒó®Ūb÷-zv0ŗ~†F;_Ć@ƒŽś3U1śx²”U¾˜ ­XS9PœhÅ:F‡ó6i—å0Ns&āÖĖč6Į1ņ.GŠyšśrŌµį·žų_Ć_ĒšŪåķķå`ÜæĮšŽ Wżq8Ą_7p9xOš’ī®Ś Ńeø”üÅ“ “T‘Gå“”OĪŹ–,N&’¾š)·ĪS1—0×+s‘D2^*C”5häÓc©N*CŖ½¹*y…ī¾'ج¼ĘZ¬ńj•eJ·+0ūē˜ībŽķņ+WŪ¾4Šā£Įl)Tį2ßī[Ć6Ż­«<H -JL7,érŖµ)%2ņ*Ū©’œe ÜFĀܕļ3bl?–¶ķĢ\YŲĮ©‡oœģķ¬\Ķs¹Œ’Ķ“+ -זXÓFEY ’\ŠPEi Čl«µæxŠIiō“Źłī»]Õń“¢śæÖR [˜œßįŲ_“ĄėžēĆŁ³öńūć®×.¶Ļ[9Ćæ/”…Q?Éߜ»o_Sƒ[č\[3Ō.;ølŸlÉöņ-ü[ xłó¹ń$‡÷ž{MČā-ŪJN ©‹=(g{×°cēĮEX¬¹ŹĆ^—} I5bq˜—,©!Ģń`B?ø‡¹1|+!eZ|„ōE˜OēSe¢@lŠ Y ™t\³H*œ*ŸĪ³•…Ü­•ę¤Š‰ŽG¹lóeR+”QfĶ:YC÷’Ī\&·lĮČņ{c ŠyØ÷Z?żŻ¼8ń SBƒr^‚>Wß>|ō°LØÉ_|{f1ī!™Ł’jƒ‡?¼ÆkÕuD&€ƒ˜{ūu’š÷AÄ/©‡śB6¼m›žßq"Ü œ˜Ņ.Ķ–³”m“YEøƒąf –ųæ¬×»;Śå;nń5Yźź”WN'WM±^óĀkt“³s ¾ā½ę{K¾]µņīÓ·švP0|‹XÜŃ¾@a£š‡:–XA­ŚĪ·¶ne KŚœÆ)<²]ķ€Ū8»‰ŗ‡<Õ°ׁ&Ļ ŗ\•}RT†.÷Ś&Ē8Ÿ³Ņ†ś_¢4p֗ĶZĘå -æā»OŚ±8Ūž”E%'uš³bĪåÓŅ4Ņ²]wi=M ^Ž’ĶĶŌĢ& ŗŽirV«ėQ£hpĻ°{åč2ī ½m;(ĘW`“Tę÷"ć>éĪ¤ŃčóŠx2A:¾ßŅ,ņŪ³± #œ/7ĀrĀ§ Óv8°v ųĘ^³f~¹;vöÅÆ&ÄŖ ‡8™.ˆ*{;ČŖÜ"¾Y«-Żõ˜*³įo\ø zū]Ļ#Ē5ø½­0³…/‰ļīåęĪžĖ›YQwnєŠ/_ż•VŪnć6}÷W ‚}°Ē*ś˜M²qć58€åd±“DĖD$R%©(ŽEž½3#Rv.ŪnօgęĢœ3dĪ¾ŌŪząnT)!3Ś „•.Ąo%ČļŁ•ŃĪ”r¦DiŠ%[i!+…sīVeR;™ƒ7Œ™Ö"ƟŌl|+¬„Óč\xe4 §éĶšc- m,TĘv‰­Z7_”]D…•²’Ś» @*%‡_Ü­ęW×°A¶„Ļ•ėpH U~‹k”ƒÖŲGŲ`(‘ēŠR‹”Ę! •…°9š™zgU±õ`Z-­ŪŖó­Ø”ō&’q]ą˜kŻ™&”rPuhĘ0•üūä7ā…ÆG£ĻŒ®Ä“ńŠ8¹ņ9“µGŗH¬ŖK%tĘčP]Ÿ9~ AĢšDĮ„€Ł.į M[ļėÓ$iŪv"˜šÄŲ"‰%&·ŲŁEz}‚¤#ę^—Ņ9ģÖߍ²ŲćõD¬2±F®„hIAŠ €,Z‹×ŘŠ.šąP¦}Ó"E,żp¶M°FGÓęéü1Mēé¾ĪWŽŻÆąėt¹œ.Vóėī–pu·˜ĶWó»>ŻĄtńĶ³1Hl¦’Ļµ„"©¢ŽŹüĄO‘¹%čäj™©Ź°<]4¢P˜'iy*ji+åHZ‡$s“G„<›Źō]mqJ.±Ż*ĢÓŹ˜’—OĮ)I"ŠżŚ]IĀŸā üŗl’ęCIs¦±ģ©d‡’Ž«Rł]7ŁÜ‹·£Ļ­ćiģŖ„ĀpHPŗvMUIæ5yŒę‘ŗĒžuéG‚æĶńņQĪcČ u‰^x×ń!ƗĘŌŲtL‰O¢T9ZÕ5„'OY™Iõ„†ŹĶ)E9ĖL./č.I`®%^ün'“ÉGüŗķļō4pé^{Ōč3gIbŽUƒéø(jić¼©BÖ1›„ėUč ņł­Ņr8z‰_2”aĶęlĀVK‹ØøŽ&^éŗń°±˜ā*;‰3ü?¼ĒĘK¤—?ų1ĄŲ8tƬk‡ŪkC“a„o,MÉk]˜¢ņ“f EÆäļ"õ*ƒĢŹļu ”cØ×^‘ąķµūŽgŽæŲ+Ŗ÷†²ŅIn}ļĆ>Źe—*õŒŒhķ! ĪŪ#"įßŗYćü{0ƒM£3>!ß8ė§œF¤S‚®Üō·ū—tĄÉEˆ<$“†ė„æk·tņ ÷«·Ā=Pk—\Ėpēēē°%nFBé=Ŗ>ŗE/ƒ·^Yö®`ēr“ŅÕl¾80„ eŽ-¢“±)Ėą QUø{æS0”#Dż[浦}oćéŚXĶ§,’/Š­Ž—Śō„;›”“Ÿłįß³«ÕņöādöKjīł\ŸŠ#pĪõ aƒmsƐetŲ_䂟„Ł|ż‰Ī\+hŁžG¹ė…DZQ8”īĖÅąTŃn›0}ē+®ņŌVY˜öŲMkY›lh‘]ÕGcnĄ*ŲĢ6„YÕßµ†iR5ķ!ŠāųÜ{Ī¹ēśÓE[µAxvĄlDĄ•“LH!K°žāWJUc¤Ė®Ai×O[+”^3cV„tąĮQ,Ą*ŒZĘé+U{Ū3°Q,˜ĒDéęč'jPZih”ŗk‘w–ź”"°R#ŗĪf"śņÉ6‹ÆÖ°'Ź_3ąˆ@/lEw„^éŲS)VĀµf5I'ā€K¦ §–«ö EYYP½Dm*ŃRæĢII73žŚ’ÖƒźF)3Õ£KųA…œä«÷pBh1ž»8żčŃ ;€T:ƒĒź€Žf¢K̶LrÕ½ö Ž÷c•»ÉóR@ķē׀Y‡v€ŹŚö< ū¾_1Ox„tNĆr6I×ļˆō„¹•5Cnżģ„&ó°–Xq–ךõn‚~P>Ä¢×äø,—m¦ĢĒt4m¢HŅēČ6ęg“ˆRˆÓ|‰Ņ8]Ā]œ}ŪŽfpķvQ’Åė¶;øŚ&×qośµ(¹wČļqr½$ĖØ>µŚ‰ ¦Ā9ŠÅ,O—–qN¦E.ö‚“DPČGV‹ĀmŽÓå4˜ųx&ūäĆģ‹eŪŁós*Ā) -'§/’;˜0`9E•q;<ƒo>”ųdQó;Æ’ĻĮK\|~„U_oŪ6ק8š®µõŃn×h‰kmĄr[ō© „“ĢY&5’Šāžī;R¤-ÆŁ®Åļī÷ēīņśm½©£ųę&‚˜ņ -!“Ā0.ø(ĮlšÆģN --+LTŁģP˜¤RČņżK® *Ģ'ֆKYÅ“ŚTöēĻPhĢĮH—*©YFT¦e -a*‘3x•¤Ók ÆØ@ -“ŃRĮNŖāėĘŠAÕeV*D‹ERD—~¾XĶī&P Ÿ:GZn6t‡kh„ŚBA©Xžs[šUĄģØ°d*·ü3Yļ/7d+Pé Æ©ŽŹRI§Œī‡²Äu/O„ĒŚ‹1€”ČR~5ü ®č‚ ŗšo/®Ē.zĒö ¤Fć); Ó™ą°]]q&2ķŁkĘĻ>‰\[/9* ‹ž5`&8°1¦ÅqŪ¶Cę„*ć@1~GŹĪÓÉKb>ˆ -µ&µžl85¬÷ĄjB•±5a­XktF¹ ­"ÅE9°Ń:4Aߦ“h"Qļ_ Ł˜óč"Ia–^ĄÆI:Kši¶śmńaŸ’å2™Æf“Kø[Ģļg«ŁbNߦĢ?ŪČßgóū IF„š±V–!åVQĢ{ż0Ųnń>é3^šŒč‰²a%B)P¹a©Qķø¶Öj™S{ģøqM„mč7Üģ˜Ų·$÷Ö¦ņc¶’²r·¾Sā˜Q÷—(āŲ‡)x¾g’Մ”2ŽĀ ŽVNuÖ 91ęēŽ†ŸųSĖ•ü¶Cg·éÖĖž7Ė8r»äūÖ>y?čų.śQ—ƒ£i?ŽŖĒŻMőf=5mćœr!±{Ņ>ŅęÉūÉ=¼ŸĒīš©äµŌnĆ<£ “ĘN»cTĮÕ±d¾ ņ?g±¼Ÿ, WćčŸ`īؖ”=Å@`ė·ˆĆµž33ģc¾4ūš00EĀP)ČČ?+k æRŠķwY39ĮŌ$?”Åó< H¹œVŻ'!!ļdī{z"b'Üč®'Įīą€a[G ĀóÖER—²(¬9‹īĢōįōū8ĮąįSYœ°ōĻĆ>|Ž.ńé¶BÓ(’ēg×Ķš†ŠFdĪ·/_œéŖÉĢU€7š®]D×ģö£iR³ \½>æāŗˆŃ>ŃXŽØŃŁ[ū¹ÜŃ¢“ü†–očd·œą/<Ž=e‚0Ƌń7éÖti;ž7 Žęg¢ ­sœšÄq8žEÖQīŃč\ģPžŗ 9D‡čķ/ŃߝT]OŪ0}ĻÆøŖ&ń”ŅL{„ ȀjÕX+‘ā ¹Īmź‘Ų™ķŗŠ’¾{Ż¤tūDB©ŸćsĪ½×ļOŖEÅūūģĆPŅh/”V:æ@ĄoņĢhg -Ll^—Øżg”3į]Ž(Sƌ¾x’Xń³š’„’ØfąM`I*!鑚¹o„EššI»I:ÜZ¢£‘ŃĘBiģZŠU³šƒbĶ"·ˆ,Ć RÄ@?žLGg0'żŒĻ”[ćH@£ü‚ö(±0'*‘eŠ(M/Ź „sa3¶.Mµ“*_x0FėŖ¢ó¦l%vbܚø;–¼.MŻZŁrŻ†Ń‡"bĖļoa—60Ø×~ķķt)– ‡Śį ;`H˜ä’°²*”Š2 [w›3Hć]Kbf\FĮ -˜łö6¾«ĄĀūź0Ž›¦ˆ x`lwćKJvœ^čs­ tŽŅśZ+KĻ– *R%Ō“¢į -†B… „ÄuŽg“ėš`»L/”uÉśöŠM„õ’Fi>$é(ķĆķhśqr=…Ūäź*OG)L®ąl2>MG“1­†Œļłi4>ļRdt>U–MRʼnb¶ÕOī–¶N®B©ęJ’=×"GČĶ#Ś0'ŚR9.­#‘µG©|h*ĒŠŸ¼ń˜š‡SŠū©Ś ›SÄécŪ)q,ØūsŌqŽwSš÷5ū]euƟPĄķ„C#õ}X×o†“hgØį3÷Ø«gd”Ŗę~ŹŻŠŻURhFJQóՎƒZ‘żšŹ²¹Až’7›8’… zžÓ}Er=źģ5ŌfO“Š"š1ńß>œYž¦_€ĘfĖ²™}AéŠķėžäŊņ•Cą En•MōkŽ~h—ĒN0)kž4jČĮ†Õ¢Æ­†G£²ö]žU=£N€y­eßßÓEJ“TKæūK{ŗZ1 MØö‡‡?€{Løx“(vVŒ?8ęÅóķŸš„{Gįœēč9ŠNŽ£ļUQOŪ0~ĻÆ8U<“Ø$Ūat@µh¬•Hāir’kź‘Ų™ķ:ÄߝӔŚ„©Šbßwžī»ļ܏ĒõŖ¢żżöa*K„L+'¤’Ŗ·BĄßŁ©VV—øŠś›Pė‰)š -•³ē÷ÖNj2–2Ce1§=vR‹Œ^‰^ŗV„©nT.ĆI2}¢­ŃŚ@„MGĄČ“q“PvAџ$ˆ>żl¾ˆOĻaI¬ŸKŪįˆ@+ŻŠb¤…V›[XR*‘ē’%HE •'Ā@ƒ…09œézmd±r […Ę®dMē-ø”dŚ“±]āžXŖu­›M);UoÄĆwJÄ%ßĮ4ŲģFG]‰5(ķ ±ų”Š+Lt‰XU—RØĢ£7ÕmĻ Ž7›$:åꁚ„€^ī†p}§VĪՇQŌ¶m(<įP›"źKŒ.HŁYr~@¤{Ģ•*ŃZRėW# iœ®AŌÄ*)q-EĖōņ ­!ÅU1f“ķM°Ū¦'ŃzŠTśnÉ&|“ādŸ'IœŒį:^|™_-ązry9™-āóę—p:ŸÅ‹x>£Æ)Lf7ŒüĻĪʀ$…÷µį"ˆ©dE1ßńSĻŻ²é“­1“K™QyŖhDPč;4~:j4•“ÜZK$s²G%7•eč«ŚxLxć„ä¾åTOsUzÄÉŻĘ)Q$ČżŖ(ņėż¼½g’2!„Œ‚~ä+CV¹$©Ė5ūwjŖ”gs ¢xhŃ°)IźĶØEŻÄśuŪ¤T?m„]^ź$ö7dBAJ£-®Ę²~T—ŗŻ¹`ę>v{­<žÆ`Q•‚šü†«‹(:Tłnl“ šš‚ń³§…£{@€Āv§Jž$iBčćś7`DEB±²¹U1‚=ŅÕĀ–R·¾€Hå`OĀė'&wŻóŒ±ĮÄߒtQp§e¾Y‹ü»nRr ,•yā?~Š„KĚĢ ;bc>v䃻ņ=ŒęW¹ĆĆgįƒ9g! sļaDƒg¬^Ś¦ Ļč’ ?@OŠ†Ąčȓx ƒąųSšUŪnŪF}ēW ² E,śØ“IXGB‰Ta2 üd¬Čµ¹Ėī.E«†ž½3+R’·ŗ€Aj9—sĪ\üÓūfÓįķm·°B®•RIU‚Ū ą_łVVW™²­Q¹lßą©+į¤Vó§~¼ÖN9 ’}’9*‹8ķĆDČ鑼µė„AXčV>\Géāč'Š -Ł[ص9b1rÕ:ŗ؎A”‘qŲ)@ŠčĆ'Ė,¾›Ćš°!ķяtŅmČFZč“ŁĀšB‰¢œZT ]Ō;,…)˜{®›½‘åʁī»‘ åĖ˜JŗĄŲcą!-qŻė¶§rĮŗc_(Sžqś\“;śÆ£›·Ž»{PŚAkńŠėLp XŻTRØÜ{÷ģN9ćCDÆøŽ <ŠėK3nØĄĘ¹f†]×M…<Õ¦ Šį'R6IēoōąóYUh-©õg+ i¼ŚƒhU.V„µWŠŹ7”č )®Ź {Ū” .Ėtm€HŌ/ H6įk4ŠRˆÓü„q:Æqöėņs_£ūū(Éāy -Ė{ø[&ć,^&ōkQņĄžæÅÉĒ IF©š©1L‚JV‹‹~0p·ōu² ęr-s¢§ŹV”„Ž”ńƒŅ ©„åŅZYP{ŌŅł¦²ģś 7žšäŽrØ~Ä2­+ļńa×wJ -źžUśūa -¾æf’Մ2 †éHą~Ä”l»"§ -dUɒ†ĘŃš“žqāyĶŠ¦V“<7­eiž ²Ś¾²FN›ćšÕæs¾Eį“CU¼ęp² žšš’š¹…;ƒĀѤ PŲ]Õ«?0wSģ†'±0¢~%\‘¼~ƒģ<4vŠ{śēZ>Ń׫ØZ„‹ĆĪRåŚJ žóŁÕ k‚–EśgÓ®Ø/`ŻŖÜ|¤µJsÕęīśß`N†ä7>ÄQ>W\ūDŌ?ĆøU[EŪqüöōŁR«äøöAŽ¼cć>ÄĖ0|ra/’½ÄŖiŻl–=ü>Œ“löĀö›ŌR¹‹“ĆYQ­¶ēėĆéd%j³Ł ī#–óŌņćē#fEc^¤1—ż(ļOfCfŽĆx“›h ę(w¼źø¶Žš¬üĖa<ĮĶŃ!8ĮūwĮߝT]kŪ@|×ÆXLbćX„IH¢śƒŠ,„!Oį,­åk¤;õīdÅ-łļŻ=K‰”PJ ¶šigwfg÷®nź]„£Q#XČ!ÓŹ ©¤*Ąķšg6ÕŹźgR”ŗˆ6ŚøłK†µ“ZMĘß;™”²˜ƒÓÕ"£G¢·®a”• †ĄY”,†@рVČhm ŅęXŪČMćč vIō†}į„€Žž†p½S;ēź‹0lŪv"<į‰6EŲK ļسĖd~N¤{Ģ½*ŃZźÖFźńę¢&V™Ų×R“ģ 7Ź±h u\cFŪ~NmzoZO‘¤ŸPŪ„÷h%'ų%q2†‡8ż²ŗOį!ZÆ£eĻX­aŗZĪā4^-éߢå##æĘĖŁZF„š„6,‚˜Jī(ę'óŌsąié|²5fr+3’§ŠF…Ž£ń‹Q£©¤ek-‘Ģi<*éüPY†ž”×„_ÜR»Ÿ9U·R©Ö„GÜī»I CAÓ_  -CŽoĮæ{ö·!¤”aŠoū*ĖcA…ĘĻ€E•[øš¦ė»ėó[)Č^{ņŌ:9Ļ•€½(eNŹm‹ęµ…AV -ņćļ Łę<©÷°·wĮƀ¦¼žŒ`jP8ŚR -Ūn‡8‰Ž|ĒĢM ėŸÄŁˆ -xčČÕJTtµšO·=¢¤„ł2Ń`rˆīo½oŠ5FĮ^Ė¼; ż³n6ä l•yOOtµQ™&sgCqäīci5”»ø8Į}ļĢW‹É†—š¼7×ĮoTŃnÓ0}ĻW\õi«JƒxĖu-DL©ŌdL{tŪÄZbŪYZ&žk7”E „xØŖ8>÷žsī¹y„kÅÓiSX‰+阐BVąjüĘJZÕąrĻQ;”$š†Y;'„Ż ŽŅb N@¢§æ\ķ\Ļ ĀJu²dw‘ä«K G4 $z“2Š*sģjĶstŠ+« b‹ŅŁ9@ŽŹgė"],aGT=¾öˆ#½p5Żzež`G„XY -ߚ5 $“ˆ¬˜)½J®ōĮˆŖv z‰ĘÖBSæĀKÉW#{,<¶%­Õ RĪTfĢą ņ’ßĢ_Ć]š Éšvrł. [v©tOÕƒĶD—ˆµŗLņ€ŌżģA‡"jė',Hµ;æĢy“’ŌĪé·qÜ÷żœĀseŖx”ߑ³Y¾|E¤GĢ½lŠZrėk' y¼=ÓĊ³-qmXļ'@,zCŽĖjęŃv Įł˜N¦Iśł²…M’Ņ|7Ižę3xH‹Oėū’Ķ&Ɋt™Ćz‹uv›é:£§$Ł£G~N³Ū YF­pƍAL…wĖ³<|Z†9Y\ģ'y²źX…P©g4a%4šVX?ZK$KŠG+\•õŠß“[rMv?łRĆ2J5qż<$%Ž„æBĒį|܂ŸŁßBH%ćhÜóH9§•ĄÓF—žø>üĀ3$‘Vŗ’•GlKfÜ?ü¬ąŽ”,Ć»fO/¢—č{tõ!śTmkŪ0žī_q„A“ŚcŪ±6KfVØŻ•~*Š}¶µŚ’'Éq³’’¾“b·.ƒQĘ²žÓór§ĻuQ{ĮtźĮV¼DH¤0Œ .r0žNRhYb(v¬äé¦6\Š5«pł” {ń-ŲžÆy‚Bc -F:š¼f ="™™–)„•lDŹ,Ęóh5zER EK•TGŠoC å±"°\!V(Œö"DW~½‰ĆÅ2¢mń)×Gh¹)h׊Jõ•biŹķѬ.h”rD,PaĪTj'²Ž+žd+Pé‚×t^l„D«žŒ>ī%­{ŁtRŖ;3fšƒ -Yɟü0¦ 4ź¾Ž&ē]±=i ŃųZŠ9Lt‰XU—œ‰Ä”;u/gĒū®ˆÜŚō€9) ³į6`¦O - 0¦> ‚¶m}ęūRåA/1ø&g×Ńņ”H÷˜[Q¢ÖäÖƆ+ņx»V«„m‰kÉZ›  Ź5±h9.ņ™Eė¾ †1½šÖS$éĆ dsę„Ń¾Ī£0šĮ]ŪÜĘp7湙ÆćpĮę›õU‡›5½­`¾¾·ČļįśjH–ŃQųT++‚˜rė(¦ƒ~ź9ŲnérŅ5&<ć ÉyĆr„\īP¹ńØQU\Ūh5‘L©=*n\Si żK›ūį’ģ~“„ŗĮŠ„,ār×uJ0źžEøõ~ -ŽŸŁæšJ^?óq”ØՁg$"s#Ņ5r.„¶ą5UFē 6L·nūŃVc0:M e¶Mä»c›<“ń8øKŽ—ČŁŁĆU§“›Äž×žĄKJF‘¾ē¦¢ü Štøłå›÷ģŃX€óÅž¦°PČH/©ŲvĆh‹ČķOLŒż¾žIĢ«Ąv/™ņĮŁgļ–e“ßųźæ€šF ŲIžvk{ÖĶ–’…¬‰C ¼wÅ'nć‘·ƒŠ| óĘÖ1Œ,…a¢'Ļ}8±ĆÖEī`rīź¼ƒē]|ńžTakŪ0żī_q„A›ÅcŪ±ÖKfVØŻ•~*Š}v“Ś’&ÉqӒ’¾“b§£,+÷īŽ»{§Oj­‚p4 -`s^!dRXĘ%Ų5>gS)Œ¬0Vń|ŁXÕŲ”éķģ)Ce¹‚» ×`^ -Čā8 ˜uh÷X[«ĪĀ°mŪ ó„'R—a/1¼¦Ī.’Ł{"ŻcnE…ĘP·~6\SW[`ŠXelE\+Öŗ śAy‹VSĒE9vhӛąxLÆMė)’ōćjó3D ÄɾDIœŒį.Næ.oSø‹nn¢EĻXŽĄt¹øŠÓx¹ ·9D‹{‡ü/®Ę€Ō2*…OJ;Ĕ»Žb~䧞ƒsK7'£0ćĻHž(V"”rƒŚļ‡B]sćFkˆdNöعõ¦2ś‡¶~K.©Ż.U·Y©”•G\n:§„!#÷—(ĀŠŸ÷[šö™żĖ„”2 ś„Oך¬¼ Ė”|ƒ¬ßmx”ŖāńčŲožÜ/ĪŽģÕT¹·ģ -A*ŌÉ’ŌYÅh&o»kh„E~~ų/x ČŁą¼>÷ĮT#³“¶ ¶ŻR¹Lrõ3;éĆś'ń׬gBšņ»®QQP°³¶? .5ŚF ŲHžwg”ŖfE“¢™Æöš@%m2{zČ:ō”{ŚD"ģŁŁoĮwu€“—ŗ;łŪ ¼w»µ› `xī3ļ‚`\|~„TQo›0~ēWœņŅ&Ź`Śc;­ei¢”U¤*tUŸ*x%6³Mi6õæļģ@‹4iŖ¶H²¹ļīū¾»ććY[·^°Xx°€ or) 悋 -L€?ó•Z6Ė+©¹įR$F*,ÖO9¶öč[¬ż_ņ…ĘŒtŲ°e9=Yšž)„ģDĮ,ŽĆd3:¢)Š¢„‚åuĻ:*Ķ!#°J!īPķ$ˆ.}¼M£ÕJbmń×č¹©)†kč„z€’R±¢päY\ŠÅĪ±@…S…œĖvÆxU½@„kŽR½ŌJI6#}H<–%­{Ł R&Ŗ3–šYÉü÷pL4ŽĪę§½c{Ņ@§ń5; s˜č±]Ūp&r‡Ō½Ō ŽwC™ŁęsR@–Ó0`fģ@mL{}ßūĢö„Ŗ‚QbpIĪĘÉś‘17¢A­É­§öC¶Ö«œeĵa½ķ k”bŃ+r\TK‹ÖćLŪōjŚH‘¤OČ6ęz4 ˆ’|“(YĀm”~ŁŽ¤p^_‡q­Ų^Ćj_Di“é“0¾³ČÆQ|±$ĖØ>µŹŠ ¦Ü:ŠÅdžFvZ†>és^ņœä‰ŖcB%Q¹ķhQķø¶­ÕD² ńŲqć†J[čŚģšŲēd÷ƒM5ģU*ećēĆ¤£éÆP»·ąķ=ūŪRŹĄWžhńˆhć ®š-; 7˜č±CY(”„Gwź^Ļ Ž]³ćņšRĄdĆ0ŽŃüģ+ēaŲ4ĶLxĀ3có°—^“³›xõH÷˜[]`U‘[?keÉćŻ DI¬¤Ų×B4\A_(ßÄ¢±äøĪ§Œ®ś&–éĶ“ž"ImĀ×h“ˆ!ŠGšuGńī£äŪö6ūÅĶĶb“D«¶7°Ün®¢$Śnčm ‹Ķ#æG›«) YFGįÆŅ²bŖŲQLżŌsąnéźT•(U¦$ÉÓy-r„ÜŃśł(ŃTÅ„­ˆdJķqPĪ7UÅŠæ“õSrIv?qŖn²c -øŸēčŚy?æp}¤( -.?f<­Ž|/“sÄQŠn‰źHīž§ę0… :½ļž”²:Ōé0üõ[šP·ƒ’óšł7„Eįh”hlŗAćLf÷„›õażziŃÕVĆŃ°Tæśµ¬wä?dµ–’ųH×õo-É.ўļc©żµ›Ļ‡10āŪ%õŖhIż-Š¹×{Ū;…ŗŁĘē>ćK¼_‚?TĮn›@½ó#Ÿ’Č5UiՄ&v‹aɐF9.ĖV]ŗ»„øQž½³ ÄT•¢ŖĖf½oę½7oųtŃVmžpQ#p%-RČl…€æų•’FÕøm­PrżÄŃ’^3cV„sŠĮQ,Ą*‹ZĘé+U{Ū3°Q,˜ĒDéęč5(‰­44J½µČ;KõPX©”Ö¬RD_>ŁfńÕöDŲį a腭čŽ0Š+ż{*ŊBøÖ¬!é ńDPcÉtį“rÕ“(+ Ŗ—ØM%Zź—9)éf"c†ĀS[ŅzPŻ(e¦z4c ?ؐ“üaõNč‚-ʧ=ŗaŹBgšXŠŪLt‰XÓւIīŃ£ŗ×Äń~,¢r77`^ -Øżü0ėŠīPYŪž‡aß÷+ę Ɣ.ĆIbxCĪ&éś‘ž0·²FcČ­ŸŠäq~Ö+ĪrāZ³ŽMŠŹ€Xōš—åŅ”Ķ‚ł˜Ž¦MIśüŁĘüŒQ -qŗ€/Q§Kø‹³oŪŪ ī¢Ż.J²xĀvWŪä:ĪāmBOˆ’{‡ü'×K@²ŒZįS«b*œ£XĢņ4qpiēdZäb/8ɓeĒJ„R=¢ö‹Ń¢n„q£5D² x4ĀśPżKŪ“%—d÷ƒ+5®T¦Tķ—cRĀQśK”ačĻ§-ų÷™½B*Ó¶EŹ9­7zX}ā>śšOŸDZXi){ŌŚæ"Ø\‘59­“74ĶœœÕdu­zć3O(Ī,ÆÜŁ±?ml%Ü!EEcĶģ&Wŗ)m ÕŖčų@!Y- -·7L—Ó|lĘRĻd|˜½¾bŁvöüœJpŠĮÉéĖ’% XN1eÜÆĄ7^‘ųdQóÆ’ĻĮKpń9ų TakŪ0żī_q„A›ÅcŪ±ÖKfVˆŻ•~*Š}v“Ś’'Ėu³Ņ’¾;ÅN3£,˜HzOļŻ»ó§‹z[{ždāĮ–²DHµ²B*© -°[ü•Īµjt‰«ŚJ­‚Ņ Čvk,dcŃ`¶xJŃķĢ˜‚æ×2EÕ`V;Š )=bŪN„„nU&§A¼żEZ!£µJ›½#7­„…rĻ¢0ˆ*ŪĢbDG­’p¾€œÄ3>#]G:i·tF6Šió9Q‰,“|µ(A*Z؜,„ÉŲwŖė‘Åւīšf+kŗ/a+ńrÓģ‰‡kÉėN·½•#×}1¦šˆŲņĒŁ8„ õ»£ń¹CWbJ[h|et&¹$¬ŖK)TźŠ½»Ć¤ń®'ŃĪ„³:?>ĀIl­­Ļ|æėŗ™p‚gŚž`Ńæ¦ŹFńā=‰07ŖĦ”jżl%Å›ˆšT„bCZKŃq‚.(פ¢3TqULŻ MpÓkщdżų•MøŒFA a<‚/AĘSø “Æ«›nƒõ:ˆ’pĆj óUt&į*¢K¢;F~ £«) •Œ®Ā§Ś° R*¹¢˜õÓ »„Ļ©©1•¹Lɞ*ZQ ś’M%Ž¶!‘µG%­kŖ†”yć1įK*÷Sõć•h]:Äåcß)¾/Øū T¾ļև)x{f’jB¢ō½aņ¹·µ›bP¢B׌Tż}„¦ŸuNEģĒŸcm’ߋļ„„ śæżåB‘YTŁ1ä°ē={ŌÉą¬šgs¢±4”vżü0‰ŽüĄŌĪ`87&ŅęNh-¹õ£–†<ž­@TÄ*3āZˆ†;čå@,CŽ«|ĄhŪ…`æM;Ó:Š$}Ł&|zQ ćø_¢xąaœ|Ž%šŻŽF“d|Ćō.§“«q2žNčߢÉ##æ'W@²ŒŽĀ—Ź°b*ŁQĢöņŌqą““}²¦r.S’§ņZä¹^¢ńSR”)„åÖZ"™QČø1Ż"½r•0]ŖÄūĀé8šœ=¢­½µ\›‰‘ĖŅŃAVG‘Ä•³#€чŸĶÓ«X|öO¤­ż@%Żšl¤…J›{XQ(‘$’S‹ ¤¢ƒÜaGƒ©0 3u±52];Š•Bcײ | ¦MZ0¶ܦ%®[]6Tz¬1†š™1åW£—pJģ4hŽĪ^{ļ\lAi„Å}t@Æ0Į%`y‘I”bļŻ°ėrĘÆM½ä*‚šT@Æśf \[)€µsÅEVU5šH›4l)†·¤ģ,ŗyA [ŸO*CkI­„4¤ńr ¢ T±XÖLT\A_(߄¢2¤øJ‡ģmŪ&č—i/Z ‘Ø÷ H6įk4G0š~M£!|™.>Ģ?-ąĖųīn<[Lo"˜ßĮÕ|v=]Lē3zšĄxö•=?Ng×C@’ŒRįCa˜!•¬(&½~j1p·4u²Ęr%c¢§ŅR¤©Ž ńcR É„åŅZ™P{äŅł¦²ģzčĒ„_\’Ü÷Ŗ°…Ö™÷øÜ4†‚ŗ?E†ž¼‚ßÆŁ’5!… ƒvöĒt“ ¦Ģjö -aDŽŽTĀĀĘĻ<‰Å. īOl‡b”`IS+Jž›Ņ²4YŻ-‘ncģžV‹0ˆ3Aõū“õDX½Š#Š -Ł[(µi9ÆmD¹A,Q9;H}ųÉt6>9ƒ”g’LŚÖ4Ņ-ÉFZh“¹‚…Y&9µ(@*:(=v4˜ “1ńTW7FęKŗQhģRV”oĘT’QcŪĄ!-q½ŃuGeƒu'F.)S~;x{dĄN½īmo’÷.Å (ķ ¶xŠ+Lp XYRØŌ{wģīrĘļ]=ē"‚šT@/6Ķ@øP)€„sÕa7M3š@›<ćsRv’œ½&ŠĮē«*ŠZRėW- i<æQŖTĢ k!® /”oBŃR\å}ö¶” 6Ėt/Z€HŌ7 H6įkŌ&0Nzši˜Œ“>|Ļ>OæĪąŪšāb8™Ļ˜^ĄÉtr:ž§zĮpņ=æŒ'§}@’ŒRįue˜!•¬(fż0p·tu²¦r!S¢§ņZä¹^”ńSR”)„åŅZ™Q{”Ņł¦²ģśˆ æ8&¹Æ8T7_3­ ļq¼ź:%ŽuŽ*Žży˜‚—×ģoMH!ć(ŒžPq—µ“ ¦.Zö*aD‰Ž4ĀĀŹĻ<‰Å.3īO Ć©P0§©5Ļ "in ²ŗzj‡“Nė’Õ"ŽŅBPżža;T‡*{Ņ§µˆn#šŠšu'‰.•6\õü'¦nĮ.܏½\2ĄŽ×–WKwĄ«äī tXŸ/Š‚Y÷¼…GäÉ „¼¦w;+QŌxA½‹ššŚ -āķĄ°į}$ƒ®6 -VZfŻYģļU=§žƒE­RēĒZŁ4³uźöž× ’,Įžī#PuQĄ¾OŻVŠÆ’ęXų÷=¦ŅŹ»·ó½žPh•ÆwYėgņ”yȬ{ļī2Éģm!zu“…i׶ć]ø+Ś¾ŹŅ§½·•lż˜ Bė°ż0ŠĒŅ¤­ē“nx&7¼©öō<<ÜŖČ] żÖp­£¢?TŪnŚ@}÷WŒP„DpÕĒ¤JB ØØ-H±“(OŃbf‹½ėī®ćŠˆļĢb'TØW$dy½gęœ3—÷åŖ Ā^/€LdŽhå„TReąVų=ieuŽóŅI­¾• -§ĶęVź\šÉų)A’iĄ1ų’Y&Ø,¦ą“1,EBH/]- ĀDW„ p<Œ&] W4 2Z(“Ł1rQQ2ČwAd±@åģ Bōįgóx:ƒŲ3>•v‡#µt+ŗ#-ŌŚ¬aI”DšJN-rŠ -O„3aRžčrcd¶r k…Ę®dIłb–MZ2vøMKZ7ŗj¤ģ©nĢčĆ-bÉļoį˜.0ØÓ|ķtĻ<ŗPŚAeń5: w˜č±¢Ģ„P‰G7ź^rĒū&ˆ^pAx) —ū×@ø¶R+ēŹÓ0¬ėz <į6YŲJ ?“³³h|B¤[ĢŹŃZrė[% y¼Ų€(‰U"Ä55WŠŹ7±Ø 9®²>£mŪūez5­„HŅ÷/mĀ×Ø3Œ`uąĆ0šF}ø›Ęē71Ü ÆƇ³x:Ž`~ £łģjOē3z›ĄpvĻČOÓŁU,£TųTAL%;Šé^?µø[š:Ł¹” ÉSY%2„L?¢ńSR¢)¤åŅZ"™R{Ņł¦² =ŠĘcĀ.Éī5‡ję+Ö:÷ˆĖĒ¦SĀPP÷gØĀŠŸ·Sš÷5ū]RČ0hGØ@ū!†ZXź ³ŽUoōŅL`N -ČÕī6`¦ļ@aL}mŪśĢö„Źƒ^bpIĪĪćé‘ī1×¢D­É­Ÿ Wäńr ¬&V)[גµ¶ƒ®QnˆE«Čq‘-Z÷C°Ū¦WÓzŠ$}wŁĘ\a Q<€/aÅcø’Æ‹ėnĆ««pžDÓW0YĢ/¢$ZĢéß ĀłE~‹ęc@²ŒŽĀ§ZYĔ[G1Ū™§žƒ–®OŗʔÆxJņDŽ°!—Ø\>jT•åƒHf47nØ“…īi³1±/ĪÉī[ŖKV"eéēŻ¤£éĻQ[ļSšžžżk©dąõ”Hbh žÖ L ‚G›qh™Ż,IY+ŁųĎ)öw¤LĄ’ĀĖŸĘŽšLĢÅĆŽ%ņrqlž×’ĄKKFm|×õD$ Šl÷ĖļŁ£D€³Ä~F0QČ Z¶;*åņŁćCæÆ’ÅŖ½ąCg®½BŗŸv"¶Ž’Ֆ°¹wģń_O>Wh%ąQņ¬[ ܳn–4°jDźjŻßӅJ‰jRsųw‚C‡ŻśąŖPT…9>ž=Ų”xšÜANK)ņĶĮŪŃE˜.5ńfˆü OÜ9oćyg§ŽoTaoÓ0żž_qŖ¶U„A|Ü[čZRiɘöirkb–ŲĮv–•i’³“t$@LšŅŲ÷īŽ»w—wēMŁįtĄV¢BąJZ&¤Ųæó…’FUøn¬P2QQ%˜Y>rōļst’ŸGi0«<0j§GŖ¶¶ca„Z™3ć(]½¢%Ń”•†Zé¾ŗ›ÖŅAÕgVhÄ„5s€ѧOÖY¼XĀ–(;|.L#°%ŝŅ÷°„T,Ļ…+Ķ*’jOÄ5LēN-WĶN‹¢“ :‰Ś”¢”z™“’®F2¦O<–%­;ÕRTĶ˜ĮJä$ææc -p Ép;99óčšķ@* ­Į—ģ€¾ĆD—ˆÕ õ\rŌķkĒŪ!‰Ś8ē€y) ¶‡aĄģč@ims†]×Ķ™'‰µf5øé#{_IV£ß}’cX„^'t„ąåÆ ™ļi“­–š D>œ…žŁ“r ¶­ä>ĶŻ}ģØ^ĖķńPšÄöZ<„vFŚÓӟB'Ł :zņčē#rcK-vĪ ĪxQHžĶV–IRŊbv0Ož–Ö'W”Tk%‰žĪk‘#äęmŲ -m©[ėdFćQ*†Źqź+nc:å?ĪIī{.ÕnUjL2ĪŚI‰"Aӟ£Ž¢pŽmĮæ{ö§!¤’QÆ[ų„”µu öƒĀŽ¢ Ā‡Åf;x,iCČ$י-c·ż …†ķ­ØysjĒā<h}’źīx¾2v’«FŌ“… ’~+B:{śro=õh HĮŸ!L- -O.@cs@Ѭ¾”ōcčāŗ'”·¢X"żF‹’®%ži7OT0ŪR%‚Ę!{]ĒĻł}m5<•µgQxVõŠ|…u­epwG×"µ©„?nū BąžBH”ķŅžä䗩~l]“wtydš"Y GO”Ģīč7&÷apźīz»ŽŁĒŽOT]oÓ@|÷ÆXE<“Uˆц4•#Õ)UŸŖ‹½qŽŚwĒŻ9n@żļģ^ģŌ ‘"ÜĪīĢĪ®ß_˜­‰ā³³Ī`!+„\+/¤’ŖæEĄļłL+§+\/µŹ¼„£Tū;¬Ŗ¶5ó§ĆŁ„“š’ZęØąuH25"§K¦7¾a”U†ĄÉ4[œ=¢­ŃŚB­ķ‰•ėĘӋźDikTŽM2Đ>]®’Ł6DŸń…th„ßRŒtŠjūDDQH.-*Š" “X -[°ņ\›½•åփnZ·•†ź­XJ¶čÉøCā¾,iŻė¦“2PŻ5c _(K~;y'Ą Qw::}ŠµŲƒŅ‡/ŁC‡‰.«M%…ŹŗSw¬Aļ»$zĶ.‚R@o†a |ļĄÖ{sĒmŪND <ѶŒ{‰ń5u6ĶęƉt¹U:GŻśÖHK=^ļAb•‹5q­DĖ£Ā‹ÖRĒU9f“ė‡`hÓKÓzŠ$}@mĮ£Ń4ƒ$ĮĒi–dcøKVŸ–·+ø›ŽÜLÓU2Ļ`y³ez•¬’eJO ˜¦÷Œüœ¤Wc@j•Ā'cY1•ÜQ,óŌsąié|rs¹‘9ÉSe#J„RļŠ†51hkéŲZG$ Zś0TŽ”æić5įƒKj÷#§źl„u—»nRāXŠō—Øā8¼ļ·ąļ=ūÓRŹ8źwŸg[‡-†7“’įօmטŠ#v…§³=īž’j‰£¼Ō’ł¼iU1Ļ¢Ķ21ü;ƒ™EįiG(l» ā$zżs?>®æ’+ź^ń+B;Šę¶t·‡i>XŁ…µĀŃ|ļD%¹]"‹¾± -vZŻ»8\M³&‹`ÓØ<0yx /%jrr,xBjˆVEłóó_‚GLĖX½“ļĘĄ¶”kL®w :»`“—ZļB™ēč9Š.>D?T]kŪ0}÷Æø„A›Ęcķhė„ ŪØŻ–>Ł¾v“Ś’'Éq³’’¾+ÅNRĀFY Ė:÷žsīĒē«jYyž`ąĮ¦¼@H¤0Œ .r0KüŒ„Š²ĄEeø‘”?˜Xß³¢F=yIŠŽ,Üžæó…ĘŒtš b =B™™†)„©¬EŹ,NƒpŚzER EK„T[ŠĒµ”ƒbX®KFBD~¾ˆfć dDÜāS®·8"Šp³¤;\C#Õ3dŠ„)·©Y\ŠAéˆX Āœ©ŌjNdµV<_@„—¼¢|‘•N;2zøKKZײn„ØnĶĀ=²’?>Ā)]° ^ūµ×æp蒭AHµĘ}t@ē0Ń%beUp&‡nÕķrĒĒ6ˆŒmż€9) ³ĆkĄLW)€„1Õ¹ļ7M3bŽšHŖÜļ$śßÉŁy89#ŅęNØ5¹õ«ęŠ<Ž×Ą*b•°˜ø¬±t…r @,EŽ‹|hŃŗk‚Ć2ķMė(’ōĆ ds5ź!ĢĀ| ĀY8„‡YōuqĮCp{Ģ£Ł$„Å-Œó›Y4[Ģém -ĮüŃ"æĶę7C@²ŒRįK„¬bŹ­£˜ōSĒĮvK[']aĀ3ž<‘×,GČå -• -Uɵ-­&’)µGɍk*m”GŚģ˜Ų×d÷³ Վ Uį׫¶S|ŸQ÷ē(|ߝwSšžšż« )¤ļuSnˆ‰)3ÖL ł# -Ŗ.hŅIµ]Ły‡†iŠuL"wVօįUwC»EŁöÅn7@ĀÄ4Ō¬¶cUŪˆšJŠÄóŃvŁ-”Ķ’Zå{IĮؼļŪ[ÄŅ HÆļnxƍ -8Æģoc…ĢŠ -` °9)ćŸdÜŗ{Ż“(Ve€­ėv·°,#¬ķöķ:ŻƒšZ XIž¶g¾{VuLU‡¬‰‹ņōDK“¦¦NĢéßsõv+ÉE”qęüü ŗgµ€“×zvYH‘oNvżń¶5†@Óŗo†iĢw2źA’ĀåÜxĻ»ŗōžUŪnŪF}×W ² E,ś(·ITGB‰Ta2 üd¬Čµ¹Ėī.E+†ž½3+R¦£“1ŗ€ ^ęręĢ™į/ļŖM5®Æp Y ¤Z9!•T9ø ~Moµ²ŗĄeå¤VɾĀĻR‚oę)ś§vēßG™¢²˜ÓŽ}V‰”žb½v0 ]«ĢūĀå,^\Ż¢­½µR›##Wµ£Å1"ˆÜ –ØœÄˆ>|“LĀŪ9¬ 8ūgŅż@#Ż†l¤…F›-¬)”Č2É©ERуŅaGƒ¹0לźjod¾q …ĘndEł.%^t`ģ1p—–jŻėŗ-„WuKĘ>S .łēÉOpIģ4lßÆn¼w)ö “ƒŚāst@Ļ0Į%`eUH”RļŻVwŹAļŪ zÅżįK½ī›p]§6ĪUÓ hšf"<ą‰6yŠ•|$f£xž†@w>ŸTÖ[×ŅĒ«=ˆŠP„bEX Ńp}£¼Ecˆq•ŁŪv"č·é™“"•Ž7 Ś„ļŃpCį·YĘcų&æ/?%ševw7‹’pĆņn—ч0 —Ż-`Ż³ēaōa H”Q*|¬ AH%3ŠYOOVKŪ'[a*×2„ņT^‹!×;4~@*4„“ÜZK 3’G)•e׳ŚxLųÅ{¢{Ė”ŚŃJ“.¼Ēū]«” ¤žUųēŻ¼¾g’%B - ŗ©Ÿ)Š~ˆ”l½¢N$Č¢9Œ£É÷sž°:±}HÉfE3+jžšŚ21OXmĻ–Ēi_ž/Į -uļuk‰P:TŁ¹łÉbš4 IOŸkø5(Mø…MÆL½ś S7Ī®ū§ -Œ(Ļ2ĄEK*ƎöR¬×ā87¬Š]xņM°R>’ÕÅN5B’$Ļ^ÄņŁūļ¼ž<Ē6čj£`§eÖ> üUÆH@°®Uźa><Šž„¬SwłÆu;xW>ʑF>¬“H”æĀØV[E{ttszmIVé.»8oŽ²}åe$>©°żoPØŖŚM§ÉżŸó‡hĶ§/ŒĻŅ+ś®ōrwgE-ŽŽ¼6O%?H#•ūq–ĆéŠzLŸ±éōĻƞNFO'r -­ņƈ—)‡Ey$·:ÓF–Ćh “1i9§(w¼€Y Žš¬üÅa4ĀÕŅap¼{;ųķ=ks7’ßó+`–*$-’²½wU{rdGėŲ‰jŁe)qmÉZՈRs¦8¼™”dm¬’~żĄ˜moīQ;[S3@£4ś…Fć»ēė«õ7{~#ŠWŁ2Ó|U%Ł*[-Du•ŠōÓłŖĢ—éŃj½©Ät™”åJc…Ÿ³iŗ*әØr*|øN¦šĻI>Æn“"ÆņĶj–TY¾ƒĆ“WC¦…ČW)ÖĪ qÜb‘]n*x±dˆ"Yiz®Ŗr"ÄIšųćקG/^Š9 ‰õgYÉõŪ¬ŗ‚2Y)nóāƒ˜Ød6Ė°éd)²¼ø&D°b‘.’b†=œęė»"[\U"æ]„Ey•­”½SģŹÉ+…LɀU³Š×»|#»bõZĘHü€°ĖO&Ä -`„žüŚ>„Ś×ɝXå•Ų”©.ŅÓt]ŗ€Ųõz™%«)Ֆ½ÓmŽ“@ņKœ-‘PWD>·‹‰¤ĀŚų!®Ŗj½æ·w{{;IįI^,öT÷~†‘=>y9¤U_WĖ“,a“žk“0ʗw"YVÓäp]&·8ƒ4QD€Åm#¾ZŒ°v©ˆĄž&3h -Ečŗ]†-”9źžˆ£“žųĖįÉŃÉH¼;:żéõƧāŻįŪ·‡Ē§G/OÄė·āÅėćŽN^Ć_ÆÄįńß°ę_Ž‰† šJ?® ģ`šįˆ¦3‹žH-ržŹu:ĶęŁŗ·Zl’E*łMZŠrX§ÅuVāŌ–€ä Čć:«ˆØJ¬ōM­’ļaø? (¹Nó|I5¾æ‘”²·—õ/€Ü“ÅŽ}R ”ū“5Ń!D+óMA4µ÷Zõ§u«\\A/—Dž0 ŁMŗłŗŅŻOŠÅ†V(N™2„‰¢ŸS¤k†”,—łm)KĮ<¤UŹŠq\hćpĖĶ%Œ0…\v‰jB\&Ču$5bU5ÖŲ™Uś±‚‰O°1KÆ”NU$Ųb~‹`¦ÉŗŚ©³B`_(äæ›ę³ōžŚįo?Ń`āąßś6>U÷öÄŪt$ eĖŒpX'Erā‹ńÕŽx|•.×!ąń³BV{MÆ^;źm’Ŗ?‚’Œ¾Šx»<Ęķ†ēŠ°ā`;ÄlüŽČˆ[ōēż‘üEåoÆĻūū§{óņāäōķŃń\bµY.ł×Å5˜“›ōŻ×)~(%žŽŸ¹_m#ÄqĘą—d•­7KœīHļE2ĒæN”Į?»Ž,«lMCS›4:“ pķ«čWWIä¶NW3Zć9‘3šōåf½_QS³,¤!gčgj€ ägŒˆĒO橁Y%PQXW„ ˜’f˜GĒ§BĀ|ŅS ķFCu Y×! -A"Į;ĀĮr8ĻŅl¾®6חi”šVµÉN”5Čļ*=Ē‡D8æüOPŽP¢£I h+XAš>ōWčÕČó›5"˜(Jj¢š9DŁTL £TŅ..°ßĮ.\}õAÉhiÜw,ü3JU õ ŲT -{5@łI!õ śļŠ™”u‘Ż Ŗ½£ øYvN/`Łū¬ķRO·*ņÅF‘ĪA]a‚Ōń!½CĒBKWŹū&¼™Āžń6b/EP}pÄā’;z@6t@s¢*WšŽhś‰öA-ŌĆ~ČŌąaŒ÷4Ž„dB!‰+•v(€×_åØ£nüzv'.Ótll¹¬£ĖKąĻq<$\čŌB,ŽV3tĄ$eöŗt$Ģˆ­:D -±ĶŹŸĄī–ü`¾L¢L«mQ»Ņ NŅŖ=”=’ē”B²x|y €“rr_–É·óZ¢Ņæ©ĀńÖ4¬°1mĀ{mµõ‹ZĆ:?Ŗ*õ3 ‹„­¾Čā¦ĢóēB -ō,¶Ś#Kō:Yć/Ž¼x@‹;XÓśxä_)‹ĆĶ¦bį -Üõęr™MÅ|³b\/.H^›i5`XEĄgĶÜń³ˆśq@®ƒ§~ICźCą“0T¤ū@żŲߟ¾žį5ŗ³ł© Å<™¦dō^ƒŌėåf>dæQM 5ķ€¤˜¹4EV© ʙŽøæNĮrˆeĄ„„xĢ‹ņ 03@°’gHöU,$_Kf³ŗjrG”PƧšž&āh®%“dŠ§R» f‹ŠWD“@S½D†nu†”j»’6+ī=”E~ ’}™žįżżĶŹsµ żj¤®‡ś“ģ­_ŗH«M± -‹£'·H§@­Ė;Ū‹āu|)ųĪ :\„æN,ӕiÉÖ ŠV-µ™ -B^VwAąĆ¾Yö@»;¤™.†Ā)ķÖŇę#ź*;d*x«ĒC;qtƒÖ‚`2Õt“Ōģ%‘O·NrQ»ōęŸÕEŽŽC§_åŁ¹ń9ģĀōżĢéC“wŚĪŠū^ÆvœBJ:sD2]‘ Ä)Ńě÷¦ęžā¶ŹÓ,8UˆgdZŁņ}‚Dš.rÉŅKF»Žwāf Įį^ė²¦]\ÖÜVę8G53+}3AŃ5ŠŚ„c@KOgŚ˜X XjøܟֿR@šłwdp ’“j#_ó 1ž,¶©+Ń2*ƒZĒyõ’ų¾^;Ŗ†zŽx§X‘b¬8-č=0S3ik¬~ĮFUū'ÜŚĻé× ¬”Mp“Ķq†“lp‘«ā&ĻfDōŽótŒxčGŻ­ūXUL6+z(>}Š—1ša-óØg“į|ć&Ō‘†~Ųų×£’łh7q÷.h=½1’Õūš{Løōām€ŌMp?…_ŗ‰żź­ģé4ē Ś¹–K^Å$1~s8Å”°œbP“\Y©æwTīķłįµ«(Ący7¬³[ž±‘Ā–[¦Éģƒ9­4“eöUö=œÕ>9’uVī*³¤ūēg›żO  -ų•ģ,÷Ļu•=»Ž£,Ė~›īżÉźœjZŒK±'ĘclHæŚŠ+lQæJč4ŻĢ u—x‹±ųjx ,¬Éwér‰ĮFaėŹź9š[ßĪöŸ?Ü=>œżżÓłĆįūOŃÆļĻūfŻ€Å÷ā*~P}A%āVĆ*-K—ū¬”ķ‹kܔˆŽŽßŒĖpwgÆ7r‘ÅźŃgš˜¦É€&•£ÜĮ8šć}ń¾gŠxß«a.^_.€Š°?Ü·+š›ŹĄ×óLK)—…ĻŸ“:žĶH—ź}‹b­$˜oŲG¾GćK“„THüŪł`pīkŻz¤×ėźĪĀś‰Ŗ@2Š’śļśė0€ö½ū׊Ņóšå~¤Ķ(üx«ųŠ†Z’aæ¶>@’‡ßōHĒ4ęÓ馥š½²±ŖŲačIĆ£¶³±ŽķŒõć?k]«ŗ[c2]ĪH–ÆŠéē-žBtu¹w‰ü³’Eh›MŠĻƒq¼ ßÄW韶^‡‘ŽūŠB$Ct¤šģ(Ķ»Łø©^׳ {KÜp–¬ō‹ć:[` eŹ\L*-øuTØŚ»+R g¦ƒ§–wb^ä`ĄŻ¤Å`#Ē²o]µ¬›„łeŽ6²„s{ļūe¬×‡/±%1H8eŪ:ńģGÆĖŻM·ĄÓŲŻ\Ū™cä¹Ł\Qļk_„-fÉI@Ń-®/« åkŠ -·8ĖܬB#ج•Ą;Ÿ­|8ī¢³Åe‡d ’ć)˜¹vķÅ+ž`­”hUOERżµc·¢ƒóÕmŻ67'¹žˆ)Ķ)˜ˆB0±[ølgś“3Ņ¶īŌžogŸZĶ[st®źł}'¢ķu³<‡[±d×õ×jēT!ĪAµ+ŽXØņ{ķi§—øLń7 K,‹ŒvؒĢģ?Ó ņfÓµ|–KCčĒOvŹ“'Q9ZKD›ēīAGsŠuŻŸqųw@Ę1Św=ųDžŻĢ«&&åĪqū†LˆŽŁM±ŗ’•éŗuŅŁCX7Ā BÕŻŹ3ŁĶåXĻceMæĶ˜&‰ÄĻŪ“–wĄ -Ā0q^†É0 ±½Ó›’ūæø•™ŻČĄ.Ž»(lžäʆ­“ć©°pŖ I PÜNšUų•åLW§Åd£v:ĘRćń0ŠŲüö?[ŒyĚ4HĶīšŻ`V9w:P YHņæO;S¼kµ¤§včźŖ~µN“VĶX‹[ŖW<€užnNQQ£bü“”[»Ś$K°ÖA%Ķ¾s_Žėœ‚1ĒŅ -é¤ ’ H eœVÖāŪąŽ%ʦMY`ĮÆZĻ£ 7ńDå41“‰ēžŠl&ĻgŹ6yŁs“Ę­ Ļ”`ŗUŠ€’ān­ÉĆ³ -’埧%§›ˆĮaUa()zāēYQV& ƒR—·É]©6Åø.nšž¬BĘß0D{Vy”2ŗć_ķ1‘ē|Ik2'euČ©čńÜōŠŪ« ÆŚ-Hi5" >…GZŲ™TÄB÷˜=9ф4'%oŽ*:褔| Ė1 —¬}7¶\{äIMnŻÕVŃŻoY¾¤ķĘmPćpøÅf™Rė7TĻض5§­·°µšž¦ŖF¤¹¶ÖNļÖi·†pśÉ·†ņĢMŽE’ –v¼4GœŚ7šetģ“a(Ņ*…ƒ&Kr‹+ĄĪPļ,+é„jJ×-¦€žgv÷DT&¹g¶$™³o>¾É,Yŗ `m‰+ĮXōjŠ“żiĒĀ²ĻĮmQoSnõ2Gįnæa×;żŚ×.N^¾żķåŪ³>¾ļK÷¼’rßÄ?Ģ-I~¬Ž0rŵÓžRćėwĒŠ”ŪA8>µ½ŚŪĒ9°o>Ä4Q,H>Ģ†āč:j:•8ŽģīŲųŹjS4Ŗšd9ˆ|-•VóK¶rP+•”§„€Ģ£‡1ߤÄŅ(°Śœrņȝl<ŽYVÕU„A°j#«‚•†0I„ké«`ÉÓ xʒMŒX±D‰Ė -"ĒJTŠ®^P‘įŲĘHÜŹ:ōO~śū&éøÕZJ“8Kvō½yt‘PCŠafŪhn‹čĒC5Łę­ļā{OdX«aõj“ÉĪk”F(Œ@3– Ł§ƒ:t@Ÿœ ‹¦VŅ6J„§7”‚üŁzƒ/W2W®IrŚRY8Ķó_’ÕŸ‚llŹÕPŅk:‚”Æ–wę„-OÆ«½ų°HmÕŪu¼*?Sģ7¢9Ÿ'O )kó¶@ū…~kūæd¤šÓ0u„RSi궰_ŲŲā;4+7ׇ,§łfUY¢Iɬv4!Wxz€¾3šŁ=ŪÉĪ‰ėōĒć~+Ė‰ģZR `J/’ Œ«ģ¶:Æss Č[@¤_õ`b–1qsC ŃĀs$Ä“‘č’zśjüē>ttĀ[ĖÓTĪŚ¶Ś¶—25‹mˆ@~]Ļp*ł°)¢T~ -Zš9Ą(ܐ­v˜×ųˆ¾Š Ģ:ż¾Ķ =v G­}ŠX™SźORŖń¢čń2™¦ŃßūūųįžŁÅC»š¤†[loéI0ml±=ģ¬æ†9æ÷Ēž—MYń™†:=ŽÕ7ö2ŗnĢ/żŪĖA%ZētĢ…|ʂĒSF7µ”l9āß~ė¬i^ĻÅī.tsśj± åļÉźKTžŒŅęųT<ŽÆ*ŁJĢÕCGķžpĘdYSrŚĄr‘gõY½ū+„ŗ²‚g`T·Ł4Uq%#yōdÖ²Ģuä8HśėdÅ®!²blŸ‰TqõB—,_ąļßūDwOąIU=<}}Æš¶…Ņ‘9õUŹ@ óö¤żķŅŚ£Z°6‚¬HbBogĆŖ¤A> *k8~= ZGæRÄ ®J”ķœ‚Š_źP…YÜf˜Ć µĘ’iēEčäNoó¦¾s<*Neē$*-½ˆØÅŲćNnJ#§Dīˆ6ØCyŒ*ėŅĒD|l;õ›ūrji_~71õ$‚KuąßcrY֙ķ51gqž£?HF³3Ō±Ēn¼³Ģ“į褏pŅ¬‘Säq{‘'ķE&Mejāź‚«ŗgU}šCń¶v([v\B+<¶CQ¶®ž«Ōćü]Łun%S_ī%(0Ņ׌52c3ZÉ"wiļÕ 8§—J‘‰ŗčXóģ橂Ŗ š|Śį~gąŽ¤ŪœŁ+ Ņ§Ņƒė4Į¬ƒūэ„0UĶ°Žmć”=PJY Ž]„ æĻ)ū¤ł‚ś*õ?3Ń5”;å\G2׏ƒ äD„¢ŸFń»īź²ę&å&©ķ”""tę¢®“@”SSĀ%!°Æ’4GLģvŪ„¦Z2Šh+Ō’UŸ$ō ćQó^“²\ÖJ‘­¬“ĆŁŖŅ+„}:&„ē€ŽóI2õĶ* ļ!•š×£ĀWļæ”3Œū@hv ēžÖœžŚēD “ß`-+˜wĢ³z›hߝ¦‘ŽžŠ±¤ -¹ż‘YDiĻ>)i“³R‚^j¼bĄREVA:¼XŃW.˜>&Į¢1ĖxŌo²Dr“q_‘óÅ,•ėüśš|?¤?Ć"ūu•}Tm{j%yĪķ†Ué]‡Į®GdåĶų“ -ćo z*źhžG° Š›o§ń%fešo4mŠˆˆh82DÆEŠ’„S¼čźtvń‰˜gérŽ"UąŌrp3ō¾#ńLģ‰ļw<ėéH²ĒŖ -µP”_tĄ[…t—֎ńŹąTūūæ§ŗˆjw†Å®³';Q WĂĶ.ļ¬%§(•ĖppÄ%'†>ƀ*cĪ˜‰F«8Åu|ļĻĢŃÜģ‹2±ØeūˆPC°ólY„v¼ `Śq·× R¾©0–`Nņ©cžWī}Ē™-RŚéTĄ@Pæav§—I©²µJæ‘ĆēbtĄŪžŸŖ)ē½ ‰tģÄ3 ‚­Ķ±jgüp*š³ÆˆŚ3Įå©ąD˜ĘV…0¢Ó”ŻtČ£łŲž\ćŽvŁEį%g¢č#YFJQIŠ‚čĀŒp?ņį ž"«RÆÖŠż³Āäщ›WõšõŠ‹kĢ‡„šž2Mń˜d½Šw•ó²ĢHZ•t‚ ’啷²ģ8a˜JJčóµLoŅ%Ī•%“…dŸGšūJ•Ł>8BVÓ§ŽźS”¤RÓ^›Ģ'bˆQĆ3SV˜ø5›w gĪŌ½^&wø**ŌŚuNļƒ·]ć")sšĢ©1ōR\TyUˆ Yė%” ‚%Øā1[?Ygģ(GĄ…6TC&’+G*2Šģį‘²£żć0|²v@‹'†Ü72dW†üŃ¹„MżŹĄ9ƉÅą]„ ĆR£š“h•Ń/aačVk•Ń˜’F'ńI›ÕV‡ģ”VĒŻš—ÕÄ2ą¶zz«7ŒŠÆĮĢok·X­×ū9’³Ææ8»äÄć#Fƒ„łdŪ\h€öė"[d ąn7ē»Pp$ßńĪ’jm ² Xh+0Féw¼ŃæoÕV]C#æŪń‹/u7z”ZEŗAzZåŪļįž‚3OTCėz?9=s26aGé§vŻŚTź¹’õʘ v‹=ł ø+Ņ;Īķą”›$["™ōš7:ģ+8Äzq L|/G~/"µEŌiĻ*™˜éKHH×k¹¤ł øOnŁ;°ō21ŠŌÄŁź ā2Ć{’> -Ļ&EcŹÕ”mz™šŸĪp€›Ž:]· žl>Ń`Ż^Txø Óߎnµ7Z=5$’«~ÓĪĄ]BŌˆūŹ£šŌśŲe{©kĄ"—ĆB~ń¼•!“³=«hrÅGZ~ņG:üØYT\”Ē³LÖĻGwŽčMĪN‘ÜvāI?¶LÓĢč3¦Īl1É¶Ć -¤‚Šņ’©Ž  s\.ņāĪ:#9L _—ūČÜČg1Pfżv±ķ9„ź£·cĄĄšåīr “Fģ OĆ6EČqƵÖĮió“€Ņv¹l<;"=s*pŽĄÓ–8°[U±.ѬįĆäÓ«kõ_¶jšį_¶ź’9[5én«zī*`’ō>ˆ’eĪĻĻ3 TØqųĻI*O¢ ·· ,äYŗˆ]WóhĒœ²G}4¢Ę5a`2£35ßåCģŽą?Ņ&0Q †ć x2ĢsJ“ȱ%6ēj4m Č fŠGķŽnoh­YvK'ŪŒ‚Eś•’ęyU"ū…ŃDgĪĒĻpĆ£<ؼz/½»{~ö8,’8zŠLk±X¹u— -–)'Śu<µZ vŲ«Zh5±\ā˜>²ź["V覐cÜQš;_Õ¶Ņ6Ņ—-qaŸÜš%^v·Ź×eĘ¾hćwŃ»cjŪäń“ČLØóĮ%'z6|Ź–‰”Ś¼Ģ ¬˜Ó<×™ -—E½‚%£QxĆ …aØöŃōęš¹’Ķą‰łąĆæÄü’g1Æ¢·äņżVƚ’SrźšÕœĻ£ÜIAĀMšŪlę²’ $ž‚1ūO E­ Æ!ÖUå_S}pŒļöē’¹ś '§Įø¢“Ōč¦2@ĮCŪāĻZ•ŗˆļėh ¶ƒ\9Ā•_Óņ…Ē4 -Ż9’{æā:ł‹{µ@GĻ\.łi¾Ü\ÆģńAÄ äĻ\šĖüXoF*¾*§ŅQģĄ÷øŪŗōŽęś°LēŖ y|ł"_¾““f!±‹÷ÅąąĄŗŲÄd0v[°=6¾Ō’ÆĖŪ}1±¦öDźfV‡šżĶOo.^¾žł© c¢iĀÜĆ0~v›³Ū"YĒÉs¤`9„„¦>EÜzNį曤 ˜^ÜGĆĄœųōŽÆz£ąmsŸXēłćī: ‚…śį‚ßo’™EXĪ“‰Š7¤ ©>B½Ų˜Iņ”{.öÅ«ģ£a# ŠŅ2Ļץz’™wōų@āÓ?˜Ē6Ÿ¬‘ā—ŻŻvē›ÄŗŠ<ŅXWŸ.csÖšé6ØéÓ„Łź³ ¶-,mA‰Q0ō#1õ­,nę?[„ř’ķ«Ąq£³Yā -÷lnfEšh„֊ÖŃĮl1PŚe›Ā™Č„t#ęX<$Aŗ/ „<9o -HOä1BT°ųĢģˆO’A½2uöL–YY…čF.­‰ŠūH{®Tmž†æI‘hA¬€¶D,Ęiƒl=I@'5Łģ“Ī&Z÷5ÅBĚ®‚b­_*R«š0‹žj»1+ HxkTØ£Ś‡ŽZš®9ąwoh]¶!Ć _dˆłŚ)Š° ‚ģ¬ƒ›IŹTU9Ī«W˜óÆ=SkŽt»¼¾8QKRÖĄŚ<·ˆVŹ±eŖØA3o>żfŸHÕ-›A25uĄØéŲ8ī‹T*Œ“.·x5jå->Ī»Ę‘0iōįؓvņNŖ3§īy+ePŌ›Cę©„ ĻM|ŗ'½ø(ƒyłųó¤3MĒ¦3œŹ9Ü C'za:_¢€ß¾PŽ|2ČC+õžt+o  "÷`uĖ`D/‚cįRšz"ē)k3ebo£r -Ó·;ŖČ’[Kś“–?‡ų;1)ē°˜Ć¢“?2֑e)NŌČ“ģų‹éŻW ÉÄąvŃ\§(ź”Ö֌Rš˜”³½£śĘ³«oįĄ£§Ō°‚6…. 'XkbģŸ2Iü6E Ś*¦_Ą ŻLd¶®PŠ f/ģ蔵”]k*I¦VŃNM$“ć,E7¬‹nč“¢µYߔēĀL/Ī5šäŃĶŒ$v¦`€ī*d©” -ŒUF<Č+Ļ5ż©°ń3z·Ž-ÆL®6čÆv«$VĘ+H¾ūN£D`Š©D}ą rŸ˜²µ ­6-“|L>6‡6ofi‹ū ĒKm3× ó± †dMAŌCČ}^`^“UeŲ€åĪŅS„ƒ  …śJ™ aõĪwĻšębŗņ,Œu§CĄ:™ÜŠšu5xš®Ų¼Wń¬#Š”ĻŁ-[³µi.ƒDÄĄ8–ĢÉOĘ”.Ģ4f5EžI„Uu?ߌ8R³a®±œpzh9™æķś Š-IˆxM§§äE äšÄUšø0ŪŸÕ~ś„)Vś.vu\„·µŠ;ėÓĖ¾L ©$w:ų®/ó6hNõÅBÓĻX‹öÅx·§55ø=Ø`ץ—±¶ō˜N‚ĖåmyxÓļī§{y£ÓļųūžŸąKI/?ARCę2Ÿüob'Xā» ­`Ī¾zü¹č÷ś€ F”?Åoż Aօ{É šƒZĄt›{×Qpõ1£ū:mµ¹ Hnźeüj —ļ˜Ó=ė…ŗ$>5÷_44}t|Ś©]ąG[4Įµü§jąĄ"t’䣩Šikēf–BāÄš"•.Źų˜:ėrĶģ|ߦŻóē|‡įæH mgü3ąĮ@='/źÄÆ”Cw^FéŻc§j8­,­wģŠńĪRfķ©Ķ6`3ł_’¬TŻ^”pÕŪįÉņy NU€Ņļ® N–„ééæĪ{Ocōä³r]ć[œRź6§Ź—*E—±L{+ótŚZwWa˜°U8yŽm(įƒu§RZē%ūz„ŹX sū\°Ż’­…é`’W&[;śŸM¶ŒŅ?!Łš“k 5¹,ŌŁ$±L&a¶«]?ŪÕīī9ļ.ŚląČ1_”j;bėxćß5łźøAÄ„rßŪ˜ēś*ļ5©Å5x“(ŗAc3ŗ©x«Ī‰ĢČDfPGļyɜ³ĻxSlW<ņ…:ję˜<|•²—øŁ…Ōa• ŒįP›­,’hL.p}kš½ G.reZH(ńŽŗł£HcoŚ>¾ŽŚ&& -Ä«­X>āžĒżōWźžŅÜ)ķå+sĮØßJY)?³*®ķ!Ķ5>Ņ#™7^­Ył‚ÆćIJŽ’s³čÅŌų ü±D*O«žQŖ1lĮļ5 -WG“ĘhB”yŌd8œ^Ļ}÷ąkLNTčpĀyŪ…Łi(QØ5.5b”Ļe²ęež‘–+åJчŻÅ÷ nl晐u–dœ”Ą‹aĶ‹J§éB †v^w€ź§%Ŗ¾4\OÖ JkՓ3Äłyjž ķX9 9+2tW‰›Õ,+=y»¦Õžµå±>r$će|9ä¤ūƒ8Ū Of/­Œ–źtöˆcŖŁ5KĘLŖƒb)%¦ŹłC~ķhBŠ¶\¼!244^g¾*f{hMÓŃoĖĄŒˆę-2=vѦō­^ø‘ Sß%É„Ś& čCŲmvq=AŸ#ĒžxšńÆ,“Ņ¾HE&Ÿ—yHe+5żp»€õ=ÆSP¹u£Åć@š‰ń9µlQųEUšńøG«Ė]±€ŖĒ/ŽŅ߇“ó•Āˆ¶/ÕĮÉ?wŠCHh¢ -†Š™‘ŒVWāÆ“-…ē«'~§zb3ŠøšZT±śńp‘NŪ‘źŗĖŸr2āmg¢Iu&ÄŗėĶŻħiĶŌjŌ€Aƒ:m?įÜ©'2Öś\±ł4Ņ§“mÆoØłÆiŗ9=#ėŖ<ÆĒ£I E®f®ļ•ÓI}é-ųÅ?(>~!1ć,ä £¾ŻÜn;Æ!‚øˆŠóÜl„žÄFXŚFZ,ųYą›ø·]Ė˜łW:©;›tJg%ś•śGnHĖ)^pią2ĢÖ éP‡õ4ēÆ~U©oĀŚęmóI|ć™cSb•nŹĻĢZĪīNÉHĢś~‰gŃŹ|š%ĘO]·_”b.ģł­rha°(]žÅķ„ Łćę4<ĻDy=Õgē¦{ĖDĮQWh±˜MĮ°r9ŌßY²āĶK˜Ņl&SC€żķēŌōķ7ūž(ŚŠķĒ «X±ņC¶ęK߀ŃŖöĀ¬v?vx–ś%įÉĪa(·ü)MõŅK™ā,÷ŌH`ߔ“ĀģNµ!gV -x“d™ģDiŻćŽˆ€ »IńäE„PK³_™²øĀcņ~;d/nųŸļ Ӟ -ĖTųÓ¾Žh"^Æh«oq”^ś‡¾ƒ@EVEcG`&ā”n=¼`²w?Š@‚ˆBų|³dm č}2ō…7Ėķo ƚŒĪ“1±^ŒA$¾v»ŲŁ^h1ÓGÄš Ü!œõŽ÷Ļ‡ƒÉĆįūĒ;“[ōž īQB8‘Š€mc$ž„Ź5&Ų'DĪ’ć|—0ą¶Ås^„ūuö0/`ÖŁ2ąAyéĻĻˆąŻź|ŠÉz™Łé‘ßHƤL„jŸ/ ]lö&63_æf9Ręæ^äņĀG>‡q€gl8•ś˜x9N\ 5LŒ[āųN’‹:^£ Õłä¼5ÜŃ7ćM®AÆŗŽD÷Ļ`ģ¢%†ś­„ŗ…R‡½ĖÄK½żQ¶Ēć÷·»ļĪž.Ī÷2’ź”š-Ś±&ĒšB€e\ɲöĪ)ŠžŻņH<ń—7[o8ļÓŌRZiSI‚‹ø’ļæyžģ›’åYmo"GžĪÆØ +Ā+rłč]6&»öJÆ ÉjEV34ŠēazvŗĒ˜ģņßÆŖ_˜žŽlKŃI‡dcfŖŖ«žzźešŪŸŅEŚč¾zՀWp-b‘L4‰Hę ų_Ń{™(ó~6Ļ—<ŃÅL©*ĪÆ"ā‰āSŠŅČ÷SįŪHĪōŠe®ežL™2Vt}ų‘g NŚ2ƒ„Ģģ”™˜ä/ÄÖ"°yĘ9Ø:#ĪłįĶxšž -fč)éO…²zčĄJčŹ+™ŻĆ M±éTŠŃ,‘ą…„q„3>gŁ”‚ŒdŗĪÄ|”A®ž©…Hń¼1…2ŗöĪ(kŲ‹±®eīB ¢v`“įw4D!’ŲłZ(@JMw·yžĘh/Ł©!W¼°ü1ā©Fwѱe –DFŪE·=}üģŒČ % ˜ ä,¦I›~Z§Żījµź0ćpGfó®±ū+";]½F§½ĪoIĢ•B“¾ä"CŒ'k`)z± ś³eŠ$Ź½Xeˆx2o“¶ņ$ÓT€ę]ÄŠC„™5ū#Œššs4µįÓ`üƛßĘš©{ŪŽW#ø¹…÷7ĆƒńąfˆŸ®”?üLšæ †ŚĄ2<Š?¦ž -B”O>yˆ-.O*员‰ĆKę9›s˜Ėž™ŠHy¶ŠR«ŠÉ)Ņc)“!•"ÕZl¾J.ī{2åji,el4.Sŗ]†ģŸ#ŻŁ¼Ū5·|!œž¶C<4&‰bJę™įT·į | Š1ł„Õ!† ĢßD«hdu:Ö ¦Ņ* åļ7  JS©…l"s]²Ŗņ "Š4peĘ@-x{֑Všģē®ėLł O0Ē”g• •A`—¬MųŒĪOBāšžĶ–\£{D?¼H9u>Ū2qń€=°87ō`3”GVO±-m‘’“’šˆĀL˜SŖtķhļŁSÜĮJ¦¾bŠ“ūČ« ¬"ZP˜[sF£$i®/.Ī|ˆÓķ6_¾—i&‘²zķć;K0^0/Ź¹łäØæÅŖ’Ī•FøĪāKnS[Xī™^§ĪŒ³dąŗÜŁs²ZČ ‰S胳ĢĶõ>•X&s#„*ōw”ńŗ¬0Įr‚³%£I#³5śōiĮMń‡š[™JTKńˆ Ÿ!—XkŠŖžƒ‰­ bfŚõ> ĪTilĄŁé‹Øæ£#^ŠXWecÆ3Ī¦Ž' m2ÆĻ2¹ÜIā6V¾Ł–æ’U#Ÿ#śa»lo:Oģ\¦mu¶ŌIŻųŚ sMĖ”×+ųhĆ8^ż%’~łĄp°d[»+]óŽĪi,4‚%-”{V²Õš±5‰ŲMūwļ$y·‹›ÄŅāf €ńēWw£ńķ`ųĻ@iKß&)5‡Ņ’‘=0Ó0ģ4aOܦ9”‰¹ĖĢ˜Kœ–-9”Zģ“³åš9TgHĆą¦c=dĘbŽuämīDĄ©Y‡ēüM£š£÷HE3HųŹwū` -˜Ę×y’tŪ5·p°Q––+k§:eĢ(śm„Ń*œé|K“ŗŖf§Ś]’·zķŗ¤é|E§Ā5b_!<ŚŠ`Łė_(?Ž78ąfšRŪ²3n - טŌn“Ž\+č{=Kƒó60œ™3ĒreĘZ 7*ט-5ĪÓ8öõe’%p}” ĢŃĘń*;µŅ4 ē…„dź”‘²óģ#3e§ĪĮ”RŅxŽTŁeāłC”dķyCŹ™ČøĪ³¤˜–[j>ĮĶ -fy™ģīŽ˜€½&ŅEC ²Ü«4“ q½›i·Ž‘V¤«÷üFZ*‘r ’Ó«6Ńiµm’ę÷×­BŽ‚ļ„ŗ³ k9°ĪįŪ7"]Ģ“āŅ[¬ėó­faƒ^z‘ɕ雈āĻLńß)„WęyÓrS­mµq$¹q'Ģ±‘½ƒšŌĮ½½M"„čõ»bbžaMż‰ac®ķ²„jōŁ5©~S-’ŠnÆÖ䋌†ņžjM<¬æB|{µ.[ ļ®Öăb -ÄŻU+½© ŏE’·Å«Ō±6éGĘŠ’łķ üjµW5 ’UtŲŗn½ĢįRĢœ”GŖCi•ŻlWĻ®2_įÅqZQŪKš9ķH|QŗAÆū=Ę·ÜA)Tü<®rqq{Õ’–‡Mpe¹³ĆQ³&Ö5å^껎¾Ö‡ó¾’žtyŪ*wC¹µjĻ8˜Šć=Äæ6§ĆV,Ź;īn7ć=Ą†m“B>čõ\‡ž»įy)$Åæ ’ķæZ#ž7!O^ -‡49@ÜLYv0b,*“Ļ}Gäv óæ4ćelTō=$’Rķ3Ü’ †n¾ɅĪI Ģ¼¶Ąģ^Õq30’6A…½Ė‹sūXZwQįÅĢ:@ -ĢsVŠ“’d_Ēų¼äæĻɁ·AŅĆģJŠPØU<1e>“ę|1mźīžÆļų£PZÕ[F55|ąOļ’ķYmoŪ6žī_Įżąt®½ķcŗ“uó²ėœ!vVEQŠ-s‘I¤¢x[žūīų"Ė–åŚÉZlĄ“±-ŽŪswĻ‘Ņ÷/³yÖź?}Ś"OÉO‰¤0” .bꌰ?¢S)“LŁ@%ł‚ £aIš²Čp)H”R­{ ŒņoxĄf11ŅŹ2ĮŸ±œ™‚*F.d.bjå:ƒńŁÆL)JKER9Ÿę~HFBŘ5Ž#dĢ˜U?ŗœ OĻÉ ¼Fł˜k'ÜĢa פź†Ģ@cŽ¦iJø€ÖT,”*ʀ#™-Oę†ČB0„ē<{ e|œŃNq0 ±.eīC©DķĮč’_A†ü]ļŅ(ŌöwŪGĻ­ō‚.‰†äš­“v±Ģ€»ąŲ"K9‘•öѕ6ĄĒw^‰œbņµ”9«.#Ō 4ž#dnLvÜļEŃ£ÖįžTI?„ŲȎĘēĻĄé s-R¦5 õ{Ī`<]šW‚Æ)-0ƒ6Q¶Ą‹Bā"颓EPMÓ -“ą"„^]°Q›£ö`L†ć6y=Ē]ņv8łńņzBŽ®®£Éš|L.ÆČéåčl8^ŽąŪŒŽ”äOĆŃY—0€ L±»Laą)GDY\©§ąV‹Ļ“ĪXÄg<‚šD’Ó„‘DŽ2e»#cjĮ5¦Vƒ“1”Ē‚Ek±….ypß *ßW)S+ńźÖWJæO”ś(wšōūöVh„żÓ¶«­J,1-sekŖß -$pŗŃÜŽ: @„żĖ Ʊć!Ū‚“ā¦²t(²ÜÜ÷Bż· ŗßrö·1&Ļń(E—ƒ(‚“vÉŠ0E8ŗ`$ų 2[¶ Ü‰ƧäRAf&LlŌöHXž¾ŗ„PÓh”SwćČÆźŪ晒½O¤7pāEž·6}ŃÅĮ`[ˆääÅžkf‡WĢä - -˜;¦Hų-ąŃL3Ķī!¹»„ä„3sc›fT™@0•@%@f4bH4MeAØ»ć¦BPƒ€:yPꊉPė7¤ ŲSĪķł•¦<ö^Įļ@"h$ŖFś:€ąp†¢~z -¤wQ«b3”ńÓ)“Ś¬]ü»€>ś ˜X^ļ†l™0‚#āĄfŁ«eP¢ ²ąw¶.®8OüGP=Ż”‚Æ”M™Bs‰Ź)ęĢł·–•.‘HhG¾¢©e— Óf®daŪē5Õ 0ĢŁ¹(vģ¹EįŗtÉ,¼g/\‡@gŌ•ūx£=0Į†ž˜Ķhžšŗb›3Ą¼Ųž¶i;ķīŹ”ĮĪ4aŚU[÷-÷S×Ū ž#ŅÕ¦¢Ź+>śæūÜżNĒ_Į§Ch Nõ~Åæ°Ė`ꋶ8ŌJ|×Ö,ÖŃ{ÆņƚĪķŗĆåq®’A©ęyMā¾öĖT1zsy|æ=Ķ<Öó/KK[’ā{i$=-Vl”ó¼ÕĘŲI’F -wČ„ŚJ±Ó<ØZ3vŗīdQZ°{ć®ūģƒ°ĪĮ -‘.C0£t=ĮŅŪõk”ĄO„„ĆšKoCіCĀ“[,«ˆ®P#¼al2U£½[É?”č(š×j¬˜._ļ”Š×Ō…‡*]ńµ¹ƒPRc‚ē+YÜo3ŗŁ …¾Œ—Wļ R¬`ŻZķŲ}vF‹Ōi.Q_a°‹ÕĒVļ†|n²{æOĪ˜Įó°`XkXõˆzŠÉ5¢ńŅžžEz½ŽŠä,†ā;99!"OÓʁP.„öÓ]§¶Ė²*¾!/įß1YŠ»Īj‹¦·¬>"_“o«“T ŁÄ7ŗķ(Ū]įŃRØ+ ‡^ē+®?raö™pāÕf6­O[£ŹlÕ­ŪAÕ 9åB|ĄU¼„‘ö˜cõ9tĄ@[ƒbļžØ”ę!bĒĒ—WgēWēg›óu]bÕ0ĶŸ½‘2ŪR„Ÿz^°=ėŽĪf¢½¶p»įiÖīPq艱ŸŠz[Ėsūă‰¹rļ-ŗ¤˜sŲžp]² -›ĮĪŌj“4ŃōĄ3wŲ³ !( -+ą½;A`šĒ[{ƒ=ˆoqæę|µüŠļ63i?x»3+°ń5• -Oü+$žY‹ ]h -ŲŽ; ¼ -.āŻĻøŅĶ‘€•u³2°ē)Š%fh7/Üh©Ń؀¦Ų"jFķŸ,–ox|/Vžjäk?|Q± «¼)’fŽ!_­ęĆ>|“ojOś•nåÅZ“’üSiOšM¹żܽo½|Ńś½ZėsŪ6’īæ§q+)Õ£É}¹qb9nb·žėŁ7–ŅNĒćÉ@$ńB‘:€”ź¶žßowń Į‡$;É1“±HūĀb÷‡]¾9[/×GĆ/ŽŲ vF‚Iœņ0ćK—‚‰?‚wI¬’H\Åė,§<žq9ūIDėE,$Oɂˆ+5Håē0±3–&Dį|Ķų3Nęé–KĮ.“ H¤a³Īłų²ĖąVH–ÄgµU"µ2œfH>Ņ_H!V"NՀ±±Džśfrõī‚ĶAvœ? •žlĆt cBŶ‰üÄę@ŠĻf!²ę cx°"Ap¢ Š Õ’õƒ Ė”%[ŠP-Ć5š› *ćK+ŒŅ„-[Šõ!Ɍ*­1zģ „*æ|Ļ:0'µĢŪV÷5Ķ^ń')Ė”Č©3ń{ Ö)ˆ ‚­ÖQČć€fķń7C$™ā2NŖ°d^ĘxŠ³ń?cĖ4]Ÿ ‡ŪķvĄIąA"C«āšg°ģõų¢BŪ9āH(ÖśoJ°ńōń5Hš)Čń-® -9H±•`ńxŃĆŁŹ:Aq™r£YAõā0§5jŁÕøÅ~8_{ģ׫ÉO7&ģ×óŪŪóėÉÕŘŻÜ²w7×ļÆ&W7×pwÉĪÆƙ’¼ŗ~ßcL¬Äļk‰J€¤!ZTĢ -žde@o1ė¤Ö"ēaźÅ‹Œ/[$!i¬…\… -—V3pU˜’S)œZŃĶī’·`īOHŹģ®I’D4ćķĘxŹpČĮūąī|1Ņ+»_¶]~H$ŃÅT’Iņ©”v›³%ģs¶pņ'ˆ*†G«XķTäČUÓTXģ›ĖdE†R)—é3ĢD6¢W<py×2Üš”Všķäęż źĪĄ'S!ē<“`+ž .eėl -DŸ•bį[fĆ£Š+pe½išŚa„į…ĆĆ"'śŸiåńŽø£?+­^/ž¤fŸŚæo7\– šwCśklƎC|õśØLžš\šÅb[ņ‚tČX»Ų"܈Ų°TÄ]sÉWeĶh_n½Jó,hQ>~„D‘" ŅNĆ|Ö„™Ś‚xclķōĖSg|õX1„YP+$ thĪVY”†³–Pé“Ā„äeM0šÆDŗLfÖ6d°”O³–j‚å€$ZŖĀā7w¦ZĖd¶P>’"Ķd ’˜²%WDažDQ²Åč¤-“IqRčMĢÄČŻ -07D«cļŲ÷ģtT~†=oæIÖ$£Z&2F šŒłJŒŚ=ošKo0jŲc3±1%\£ų1M'W°CGmG¢›S{yø8Z6döé’A¼į Īæ»ÆķƳÜÖĆ¢éķÓ ˆŅL&[›¬õ‚B$‚DEŃ”Ö3Ń0BBīÕŅr—G„JY ¢H;20ųNS4£MXĆThÓõ“­€¼%7MŅe·§“3MÖ£Fņ„ā÷Ōjį‹T”¬ä¹°;2„ŃDSŽ@]gį|.$Ų#ß™\'óœŚ— ęwŽaUK t ņYŹPl(ŲKĄ)éR&Łb©“¼ž\Ļūäd!(wŗf÷@W"j73µo$4AxōčxīaD£‘[¾'+ģ ‚ƒétåf/‘·³ŁĄąR·>ĪĶŪĻÄ<Œ!d…za­wč}VYwKIÆæĀaY«+ō*‡qŏĢDß-(ČYZĒ†RP¬\@ė;”¹4©Ī8ĘV‰ĄkĄĆB2¶DU6ķ+Arņv•¢W+ĄŸŠvMl|~kuńDb# ±Ōr—WūQ6MŁn -PĘX·ōF‡7T%^tKŠ»”ŚTf¬7£»3cZ³|ˆą,k1»!ņäßFœS6ē‚E­xÉņ§,Ī`Å*Y•¬|j²‘.Ųø£[ĒK¼ż8”f­:]Ģ„Ē! ktŻüœ^ą€ŠD§F¦æž£ŌBż‘ h„9ŻśĮØĶŲ®'ƒ/‘SžīфÖŃ)‡v½M¶Ę“=§ŽkĘćQõ—Y`"żeŃI™„§C%L_$Õ.Š2K¾6 -Ž7XĄ½MŁåO[Ø:÷¦3=‡Œd*OS}ņļéó®a¦5WłÖ££īKGĒ)D„£ ej³ł 2&EÅ(¤Ó0UˆŽž n)u; „“Ź t‚6/čmRJ™‡éiĀ€8[MQ5WzNø•.-A&ŃžÕœ¶kEvc>I OūĄó_ūÓSƒ„]«ę¹{w(:Äė3!^ŻPwøx‡£ÅÆ#®‹o]f -ĻE„“Ŗ= ,ą¶ķžĀK±NR@hPH©:ŠŃÖ3`ĮĒ$†2®€÷Ÿ)é9x“?dĒsé-!]`‚cžn¤”ń(‚H5/~a¦ˆ"°X°@‡É¦—£œ8zpśD€t`˜¹ !)iL½-ģ! ĻhPLē§#?¹Ū8ö\4aLX#|–>ćĆ`ŏUPaP„»÷µ1†‰ņ(čē5žmWŠAš¢LȎGrZD¢·˜ĄpŚ„y:>¹× -OĄ9zŠ”@ĒŽ>éŌkē–ā.7ńżNōSK‚ȐĶƵxµļkŒöxT÷@U_ƒT•+]\.2,ģ½Gp֟ƒw…jū9«œlØÉ AŸ‹ öT¬L=ÄÉĪN 7ĪŸUåłŅģJłq_zdł -VņcżIy^9)ēGbKŒ²]i*Įż‹’ĪijĪ}‡‡]¤¼WćŒ;õĀ¹OƦb -ŒĆšx†Acć yėĶ7źä5jUc†‚Ć…ę Sś£ōa]ļõš -øŖtHON&æżūāćÕõä¤9¬ *5"Łk -fłT’zēńäöźśĒ˜ky:’Ē}ÖVT›šw¼ē=Ķøgģ7ä½ü$ķ¼Ü'•YŻŖŲėĢø&kQ–²9åŲ‘:C’ēœw¬°‡“"G©ōnŁI©VŲ6ėč¼Ę£v8D©%ß/O„\Ļ &šš)ÓģB劀Ēøū%86ˆŃj·€7¶» vą–µ[½ -’ūZRœućWćÕģŖ‡_'¬Żž|ńŠ¦ķnū©tłÓęģR¹łŻ +xb!TŠ*QĪ¤ų…Źe¶SłRē`l‡č¶‹$¤āŚŖvś­­KŁ–‹~”d’ÜĮø]ļ`oŽon‹jŠę W†:œūÉßty Łæ”,ŁĄ£<Ųį{g©āJa¬ÕĀŌĒ°ćæ§dCų‚CČGūŽØź±Ą&uĻ|‚ä%'Žt*Ź8Żżh?—Y­ōG±pŲŅ­¬õ a”ÉĪ¢iŌ;jz™€ O©X *“-)‡)įń†‡6{zķgaĄSó}V(7ņ…ØÆ^XJ®ˆŃÓŊ"GLĦ%ŚŹJĒÆŹlø yœvd¶®a:yGĒ(ŁąāOékŌys”µa£ć×ö”nŪÓ½…¶¬MŠ -lŻk£ ŠŠŃč˜ć KšF*S -ļT‰ŚĒ.÷*‘źp·Ē’ö[ˆ%ˆdž?Į)ēL߯}Nżq|qūĖÅķ]Ÿµļń)mÖ~F—ÅT&éÆ<§ģP¬:ģ-;Ž_q¦ø"C@Į\+—»€”Üóøē­ÓÉ䰃Ķ龃 œ+oą·„]9o®S©Åīīśż{†'V5ŗ/`ņ\&aƁO‹(!Śņ e|ŹŁŖ[ĒŦQK±)lŚ\XÜö6¶Õ|– «§ģt‘\ÄĮž†“ėateóõ‹ćŲsßęĮśźĢ-5ŪėuaT·ż “*ܘĘg3UØŽānęź!¦eõ -Ō€‘é’EęŚĒ.š ÓŲ®“Ø “TŠ¹ŅT×|Šķfl†Ū2ęģ»ĮSXĆŁÄ\»ŗ#W\‚ö¹7I8£ŗ8hĆc»é6 DW‹ųw9«m„¹2=}„¤P_e#¼!åVńĮé'¹HD”éĄēČåU>Vķ’ĢāĆŃ\“\†š{}ž)FśsŪŹ'#Vś?ŖL -Ī±ģX/xķõ.“Ō»Ė­@ƒs2^:ÓŽį抰Š‘“ÓŠ[}Äk2Y}[ŠZSČ/•lXLUmó9 ķų!ū«f ń?EŲC»?ņU)h“ļ¾ƒ4ö -s@gWŹ(ˆwgRļ½NŠĶ™Ć›C©§ąæśŠ…WmÖwuåŚ“ķuĆ Ķ&gąĆ:^^ĪņČēŲøÕ’ÓõŲBLÜ/glŅŽ×˜lO–²æĢ¦Ļ{ ;…mčj„bĪFG’ķksŪ6ņ»źÉŌvF–Ś~Tź$nā\5ב3¶ŪN§ÓńP"$ńL‘:‚“¢Kżßow‚”üHŚĢ;m#»Ų7v`¾µZ¬öĻŸļ±ēģ]’r6Ķ³2J²$›³rĮ’ĻōMž‰<åē«2É36M#!ś0!~J¦<†_ļŲéų7„üēhü¶Ē8ˆ –āV2”&(Q[ö¤i@kQz+>MfÉŲĖęU4ēlžßņ‚üaŋe"PµˆŒĮ<–IIF%“Į›ö’× īD„<é*ĻS‚x}«,e0ˆĄśē`īŃ|0 !ķ»«­Ė %š˜Č«‚lj°§Żž|ņ/>-…“Py8%ŗ&8oÄ¢I^•`a„ŠĻe @”™č0ŹVU©¾2h -ŽņG?6Ą¶—R~™ĘÖcėE2]°i”± 0 Ć©“8ņ8'ŃR*YK›ęYŗa«ŖXåŅ°ł@Łē3iђ— +ä®GļhAŌ1AR$UóŠ¢Ł)Ä-$I™Šdš#h*»ńÉ»ėk'z½*r0œrs\š(fhé°Ģ3±Č‹R:¦ó\ā{–Ś— ¹PĒģĻūģ`vpŌļX$Ķ³y`ŸąõÖ%Ģ`5ž2ąė%{VnVÜE’K”VąZš¾¶¦wÅ|Ui‰¢ōÄ5^żöžģz|>>ė»ŃUĆ"¶`īz.P'Ąh|u‡ŗ½ČåÕÅhü;OĖä˜č3ŕ‹ī­bõ–’ųb ˆjŃCo](sš Ńi4c‘‹ĶD„ pQČ]ä6yĀČgčÖÉå#EązĮŃļŠhjŗz,)i‡™xJnR®ŃĒ@ Ɲv„ąŒs^ė±-Œø€Éód<Pɞ-4Y„ąH98’CQÅ¢§‚…Š·OŃ“DįāBó5_¹īźzź‚§+Ļ0ÉQń=+ł‡²Ļ~± »Ł*6(”*€ÆióØuŲą;ĢmĀ׿0čĘM ņā‡¬sČ ŗŗčSPųutē’ŗą“Įš©r@ŸĆR ·~%Śž$ÅՂ‹Īöˆ> A„©d^lZčp½¤ždĮŽ"x)]K&[i4§ ¢ØxÆį$¦e%J76œš[µŃk^UQeAń%āG¬Lžw¢<’J•»PĶAēö /{؀z?[FÅ 0ŁĀ ś÷M²ZīŸ½Pź2Ų“£_9ģ}ÜCģ”tąóbīŠ²ĢŁ"Oc-S”_Ā…š§§æ¾ŠÜŠhs(=ćä%…ą#5a@’šbFfƒéŞæö[¾āÆeÓ h. E‰¾žZÆ/x³”Ģ0ȏ¶Ģ.ų¼ż‹HÜc6ÄŪz6š½9¢ ¢CģĻ{’ÖÄuRlÕDl­ĄN¶£¦VĪ>LӊlźńJ©qķؓŻēƒJvŸ ©'ļ؏Šü§ŌÆńwé‹`¹­{)"šļdžÉ²/”;Ōjś‚‡œ~„˜’g1ä%”X [¹ĒDj<ōŲ^„@m0ČFā$&l‹č–ėŌ¤&h„õ%ŌÉy§–I²č‰Š„[ ÅzŌQEWĄÕŖ2öLŹģD²ÜėČŠK¤+ćk‹Pf5-ūī,”¦M"˜żÉ¦+ćÜīq°}™µģkt‡ÄW{iqD©Ū>eūr6ž‘©ŌĒvƒF&°–­Ŗ…„…MCå-‚Ś T‹XTŖĖÜ ģßOó˜æŌæž2 rī{Č!Ö<=U”0°Zb`ćŠo× ląRTtdĪF[.¢RW›ŃŅDģbUX śźöØcĖM‰ūń¬{ķ¼Ųѱl,…±¾‡ä‚Ÿ’…ÄKŖs§Źą¤<ģ;R·,eyõµ“{-*UßEå ŌÅA8']'哬”ę!}HVU -Ė×ī¹Č©Ū¤Š j‘TUq ^Y@ųI7Mw’śvŅmzP-ÄI¶,ŸÖ¾Śŗųeõć¾Ž>;ĻčmøX{īcwĖJs«I—jĢ›V˜Nõ‘ŗu|že.h…æzz™€µ ·®š5Q‡:$€_Äxroņcķm^Nį§s÷Ādķ‡ĢOAĀ‚4E3y¼Ø0""‡N×HÕ@”H¹]‹²ź$ŻZ#\Dé:ŚˆmŚ·+ŲĶVÉ}žÜ…”ZD£ktµ‚½ »~q -čø¦ >½A1"¬¬EŲa­ķĶ V×`;®ZˆG~$}].Š|ķv¢Ąæ’X -h B8£n°…²ÆOgĆ!9Dć ‡Ś“Žż.ųCyY[»O„†š»Żd" Ųī,P"š„H|;2PėŠĄä+˜ėkˆ˜‡lt槇ģtć«é‹ģ•=0ģšgfSé­£½×rS{30TÕ\J2ˆz'“qPš”|׎°'€ŅĪ8\„f` : č DB°w30|T¬² ±­Æą9ń^Ք|ż5¬w-C•7ēH -Öz34%¾^ Ļ°š”vĆ­ž”dęv¼HČ kNŒµµšdĶ Ž¬ßŻüX‘ų¹7¦›£ lfZŻFĒ~é£Ö^ąøMżV»M» Ś;Ś¹³ƒŲHļ]£ćpĒŖ`’(yA"ŠW£óŌ‚ĻoėDģ¦×¦ó`U9#įņōT“® •wŠē’ƒ8–x’RÖčŖ°„TŅ!PfÜggf7}īµe ‡¹o›ū'&yÅ&•Ev#ū“‰qØ `Ļ?VŚōɅI© ^VEĘnó$Ų’©4ĻK:–ņĖœ„4œ”1^Ų¦qÓV(џœ„š@ųHö^8ļļ¾ ķwŚÜpMmŠų_ß/ØŪźhG -zVäĖ.›D0ŌŖ¬S‚ =䌊Ų}·K[Óē T)[–Ų4fy'žøČc†™mVŚŅĖŲѬ‘äźÖÕ8GxZKbvņņ“ŚY•QŠ ™¬ž‡&C&Ųm[ ,ßŗ ->ćõŠ”·ZYƒXÕĪ„™° -s}Hcu$¤Źčt"!ńĀņ\š£Ęųtf©[­WŚö•QRN;„×¹Ÿqž¦©s²ŌŗžƒĶ³ŲĶ2_ŖĀ-Ō^ņ³['ŠšuNōS›—ŒkŠTĮ|P:ńįuA’xo˜u¢®MW赶3÷lōK²/%Tēö­VMVJŪķK^øń‚Ww¼i&mŌÉg6Ø-)?§z‡?DŒųPæsĻÉ “„Ļ½Q|\Ÿ“® \’x€©²=„J6ĶUœK?mįć¼¤ļ»ķ ¤n’(øj'Į†¹ļ%†>ī4rē%8³,]}ćŪ€ŖĶ}0›É÷õ7æ5›NA_f›ļ2åEśbø§æ -ķÆ=)»nÆķvŚ€ā#³DŽ§Ł·Uō|żõ6ąŃųźĮ°ź«É£|31Ā§įtŲņ…0šHwŒ½öįƒ.ņ{‚i~Æm‰ü ¼ WIąs×x3ć¾ ‡›P¼Å‡,įo|(£B™Åd§źŖœ£1y;hgŻ lL—äéī­ÜµõWĢē”²@ ‚K3•QÕ\q<‘·’¼‹*†jlRŲNe‹čōӔ3>[ĶĪxp6<é¶GV-'źŒÜbK"Ļė„śą‘zoŁKkŁ~Ä -«–ß“9Ć=.ńXVŚv~‡)äOĢ\ä±ü“ä*_*;mŁ•ĆĻbj]©Ž—ĘKG^ū%²ÓZj„Ŗ“ ‰ł¤¦wūĢįšāģōmˆ—åŸ$”oYÆėŽ3#xŖźØ ēւ€*Ļ'+šŻ<įęźśó”¶Nćn©3ż’b÷s»‡­fņĐ]†Ś“¾:ąŌTßō Րųvљ¬¹«E“ģ+eµĮ¾Į¦³ƒŠƒū›óŒō7w8‹ōŁØ”MkX¬ž ¼žX‹ ćœ«§Ķ·HÖ·¶ŌŹ™©sEżyØFeiÄĄõyOcĒæ>CßŌ Čī9~9 hf`ž„PŸ>ÉÓp“Ī'©ō„Ō67&Vź–nÕw·äk­$¶Ż:ņ’ŗ.Ėuƒ‰^ߍiĒÕˆVSzģ›ūV%’(õ?’D–V¹Ø'Ą?Gd˜źŠv‹ó73h¼¦·ÖūźåŽÕWŪnŪF}÷WL ”•Y*ś˜ŌNŌŲF…¦2`) -ņ¬ČµÅew—b”&’Ž™]Ž©k’(a[wngęĢ łŪ‹x_ Ÿ>½€§p/BžŒ ‘ˆ0+ü“÷JFZ†|jXä3口81s -Ÿ©Ą ™ÖT' ƅĒ#Ķ}0ŅjbęįĒT.MŹ‡{™  #dŻŃō¾ų•+'m“¶–Ź… Ä"!ó”³,PœÆydō`Ź¹5?y˜_ŻĮć&}_h§‡¤Ā¬PFhH„śK4Å|_k‚ˆšĘŚBŠŠŒ {2Ž*¬ Č4āJÆDŒžfezŸ£įÜ-bŻŹ$ƒRA%£s4Dü] „Ėģō²÷ÜjÆŁ"i Ń¼“ü£Ēcƒįb`ė8,ņ¬v†®š1¾ĖŒČ•˜…rYfH›~VĘÄĻ†Ć4MĢ<*ę‡Æ1³“鯝ė¼‰B®5fėļD(Ģńb ,ĘØ<¶ĄXC–Rm”,0ŠTaĘ£ OŚ:'AµLeŅņzUÓĘl.GSO/į÷Ńt<ķĆŪńģ‡73x;z|Mfć»)<<Ā«‡Éķx6~˜ą·{MŽ‘ęŸćÉm8¦ ]ń±"© ŒræĀ§<bKV'sO,…‡š¢ a‡@nø²żsµšJ«1Hé±ʒJ“j [Ž%/1ŻČTÖY3)C«ńr“1e8dČžéĪ‚įŠåpzŁńŠš$Ši™(Ė©a>²ÖF–—½’ŪžÅŠĬ‰V>9Œ<^‘§abmS؉9iĪk‘Ś#ęyT¤X‰ Fb£³sęų8¢¢ŗ9Q‘­Ė\üsō —®*dŖV 6<‚Ž“˜]e;L‰›>™ĪiŖ¶¢6t$M$6§ĪQ f~€sEɔ<@nĪ5<*÷A,ń`KĆŠ-ź šknŠY1=ŹcĀŗųŲ„*妊aÅ6#ÓÉ)J}E#"›‡MHX1ÅÖØÆŲ¶Ūä@Æ@×_`]ėa5Ķ‡¶iń6'Ņv.dhŪē.ĻB®›_cĢIɼ-¤LĆĘjQót—³“ķvyŠ ä5U¬īī˜·"'z+ŹE32F²c•XhV2 VˆŚf™#}he`»$ü ļ8®¹G9 iZĒ%‰i ŹÄŠóCĄŠ~ĘÉ'",“Č³¶6Y—ŗXtב» ræŃO=kč ŗpp„Š­“¶†Žšįś&æ•)ÕéĀ–,ō®nŹ^__ƒQˆé§ŸŹc‡’Ž–,Äiß«™Ŗ¦Ėf"žžSōnóóšÅ/µÆz±1ŁäŻV&ž^ ¢åźTöA™…v†žŌĪvļkRv c¤¬ž_–ĀĖÅĻ‰]Żœū×IUŠž“2’{†ukU7ij¶pū“ŻõŅī3Öź ŗ?宫lؖ-,VžżŽ-—¦R>ŽeČI÷š¼ŹVW^ŻÜŌ ōlŸb*t'J\Żˆ„łžr\ĒØ“ÆAJdżĢūג†&ĶM\>åŚ;ü RYä»éJ`–šéAsū*AB­<,īÉlrāGÄiG’Ļ3I·ŻE9ē±æßÉN6ĪŻüĢ*ZcR…9Åę7ĘmFæņvĮ¼=ōŁ?L=ÖtŪLŹą¶*@j‡J}i"³:“®÷Ļfm¹Žó¬1_T¾=ƒ¦@Ƶ’HqO‘ųÄżĢ“Uzļ‹å²ŠŌżz° +MĖŌnHmXß³@‹Ō,Ōn z5‘>ļĀĻ}ś©oi|ūž)^l™Rę?ß1ÕG’õ†©qū…’xdĮČwŲ0…ėź‚qīæƆ)ČpxĮ”/EÖõ_0äōLŹæ`*5Ż³a\IO\1OšĻ²óõ襣ĢfĀ·ķŸ/»ē¬Ÿ*ŹöĻ7oØ­’vąBų8„k;DDų¬ńÅ°¶HjÉ«q„Ø[:e+žŠÜ¶›ė¢o-Ü_¬É‹›‹WMoć6½ūW ‚=$ ×*zÜm»qó]Ų@ģ$Ųӂ–Ę2k‰TIŹŠw‘’ŽŠ”{5R8Ć7oŽŅæ~ŖÖÕ y’~ļįV©VNH%Un€ßŅ+­¬.šZŠBē •C³)Ž(„£>Ė•Å œöćJ¤ō5×+׃p«k• 'µ‚óńüöč h…­ ”Ś“Ū¹¬½(ŚŒ rƒX¢rv0Gō駳ÅäźV„•ć3iŪ8ŠH·¦5ŅB£ĶV”Jd™ä­EAĄéEép Į\˜ŒĖLuµ32_;ŠBcײ¢ż\Źü6‚±māø-ÕŗÓu(„Wu c”ˆKžeō3œÓ: ’=»ųč£K±„Ō÷ŁŸR¬Į%`eUH”RŖėö Œ_B½ä–š„€^õ—pĶkēŖIŅ4ĶHxĄ#mņ$–˜|&f§ó›ŸtŒ¹WZKlżSKC/w *B•Š%a-DĆōņ !ĘU>ähEŠoӞ“‘Jļ/ Ś„ļŃŁx“łü1žOęCxœ,žœŻ/ąq|w7ž.&7s˜ŻĮÕlz=YLfSzŗ…ńō Gž5™^‰2Ś -Ÿ*ĆERɌbÖÓSÄĄj }²¦r%S*OåµČr½Eć=Q”)„åÖZ™‘Żŗ|T-čĪ¢5]Ր~'LµĆ0V»ų*Ü“3ŒæOāäké&Ü“HOkžMB WĮt<Ÿ~ü ­UaoāFżĪÆEżD¾ŽĒ^Ū;š5‚H¢ūT-öŲlcļŗ»ė8“źļ›Åvø¦wŠŖ"ģ¼yofŽģ÷ź]=JĪĻGtNWŗdJ­ Jm - -;&ž#½°ĘŪ’/µ*mq§J©`iŲå*å b%üZ§lFWjOĘj²‹ęØŁUŚKk=HfJ‡8T^B_hė]ņå~ØĪVkĖńń±›”$Q˜ž‚M’Äß{¼¾g_B@&£ŽńóŽĆ`Ŗ1(ģŁB ĆÓćąų“T(^ÕųĖł_e%£a|yĒŒžaV)’•×9Ż ę…[„f·T½mŹ0”īpŸ¢&ČlÜĶV›_ĖŌčzū~ōO苈:™įŅ¶ģŽ¤J,öĢėåżlĢo_ƒŁŌõk0oon"ę»—˜+ĆŠéƒ» żČ¦O’Äv ŲĆżqŖ¢J?ĮWßtĒ7±h)"ė«7ø˜‡¶h$Ķó£?głL@Żl1‹”7&;¾›>Ņ}YŒĀŹfCGŽEkma6¬šąFeÅag±pœ–ÅlP+}šo¶pd”EŁĖ®ōĘ=Ųž17Wś)^ -Ŗ1žø˜de:ĻŁaŌ©U{?†ŃpK)/»M.A+ėMĘāķŃ […} ćÉ.ƱJ]7e\cJ«Dvū§Č=ķ‹{(;g=ö,JÓŌß sƒŽyƜ.÷Āó <:ĖśmŹ $ĖrhC§ņ ‹Éķć oüŲ<’ŪÜ"ää žÅįœ(÷ó©łk4śšćčo½YmoŪ6žž_q( -4.\{ŻĒ6ÉęµĶflH€Ś]ŃO-Ń2Q™ŌHŹ®7ōæļīHJ²āøFŚĶĄZāŻ=w÷Ü ½‹ŸŖUu6~śō žĀµ*%dF{”“Ņų•łwöŹhgJ9ÕUķ“eõ«ŌŅ -o,(ķ„]ŠLŽPœ4ü”2©ĢĮ–žT"Ć?3³ō[a%\›ZēĀ+£į|2»~•Œ–$×ĘV-j2Q -+åZjļF3)YżĶķ|śź ,7ÉēŹ9°U~…g”ƒ­±Ÿ`‰ŖDž+2-JŽÖ „­,„ĶÉåĢT;«Š•³E/ŻJUhoN®Ģ®'³čėĪŌѕŽ×1Cų‘Ė?Ž~€s<@BāŪGƒ—,½;ŠĘCķd«äēLVį"°uU*”3–ŽŽ56ć‡ØÄ,(} Ų0Ėī1ž¤é?€•÷Ջńx»ŻŽ[Œ“‹ć?0²7³7Ļt’y§KéFėÆZYŒńb¢BT™X ÖRl)ƒœ(&¢ŲZŒø.†$ķ ŗijƒ– ¢ėŻ6Į9z4™Įtö~™Ģ¦³!¼ŸĪ»}7‡÷“·o'7óé›ܾ…W·7Ƨóéķ ~»†ÉĶ’ü}zózC†¦äēŹ’Ä^ŠØĢ;|Jˆ-1O®’™ZŖ ŻÓE- - …ŁHĖõQI»VŽRėdŽōX+Ļ¤r$zĒ·T%?cø?‘ŖXYscJ–ųy™2 dtÅxĢÆR!œž¶c'¾­„_™¼”I{±ØKaa£0Øņ«‰“¦Źš#0ā‰`„Æ­Fā²QX Ē–¦,Ķ–xü­­|Ńt‘™\^5ßxĒ/¬ė<}ƒąņŖ’Œ>üüɅ©£[ėĒ„A›Z¬åՓįŽįē{‡ÉĆ!䲒šG^tü1‹s‚%rńźI£bŠj{~:œ€ʐžžšĘcÖ"Ÿāæ~jc=ī†>=}ƒ}¬Ł¦qŠE£‚VŽĆĢą‚Ä銏ZŹ!”u2Y–Dd nWAcō˜bē8»2„nb…ź“ŗ…ń«Į…œDyP»§ńyłŁ'/ö!u‘õ˜›0Īó{šūš«åRZŒG[µ­ NĘķkCVP³hQƅLh2i•Üpß“ø)ų•5u± -c6¶żāE!¹ ž¾Ä"¢Æ¬“™‚½æWќ”/ĶÆāÓd­­É;ępP`čiķiĆŽSŸ¤ļ5ƒ2håP~šGŚēr©4¶,›ŲźģNŽ“¦GĒź³+›1ŪēQܧ7¹¤ėqT†W‚ÕLÜį!Hk[ęƉ±Ź#>C«€“¼›&„®^1Ų‘ņĒ¼C¦ćfŁ›ļxūc¼)–Āūp†ż0 v-ųźó¼ŃÓ8ÄWĒč ĻH¬SÓuŒ ģ1s7śb©yn1IŖ»|ŽĀøˆ/w|銍˜P¶Mc”ŠC< ėõ‚\kX>lĄ­ĆU3ĖjŗLč°Ē2r|±¼‚<|’xrŃųF÷±ąĄóꯩ» -}¾q! ĻąĄŠq:¼Ów—’īžÓ}{j>īךŠi~׉!5–öÖv¼ś;ęéŽÜ™gAÕiš”‹qéÅѵ?‘†‹Ō§ńLõāi† -7öȜhŃ'Eį¼æķؐ<ˆ²ÄNµģ7^<†ó -/ų4ÓčˆčjĒĆvęźr×ųSā —ž­Ā¶6¼­NC˜}Œ6ļTŻįryµ?jR{čl‹!<<ÕöMī>mČżzwÄř`’‰÷,LˆvāõÆŗĀ5ż2ńš:æ:¼2æ?¼“ĘŽµ”xŠŽæµaåĀ˜ €ŪiSįšuĻe¬9×l—ŗ~os½ęõ ½ėšN½¼³S·ĖsRʝč«[åwŪ'14VÄć5AæÆ×įwIl~) 9S—¢)žG÷¾.õmĮTˆ]¬ä­½Æ»¹,¦Šć捡ĶqA—D…SGZüß ŹbxE!ū0Rƒµ“ā6‹Ļ÷»Ź¦ņåģ éó/•TMoŪ8½ūW ‚œĄµ=¶‹mµIŒ¶k‘Ū¢GZID$’%)«n‘’ŽJ“]-ŗ‚Ąę|¼÷ęĶüłŚ4f–ÜÜĢąV²E(“ņB*©jš ~)nµrŗÅL™Žæ­,…פņh+Qą’R9ū­,P9,Įė™QŠæ\W~a„{E©R+˜§łźč+ZŠ -9›*vŚŽķ­ÜõÜ¢+‚Ø-b‡Ź»%@ŽŹÆ7Ūģö*ĀĢł„tc¤o(F:“}„ŠJ‰²”ÜZ“œ~čN“X [2ŻB›ƒ•ućA -­k¤”~[¦’Æ"7Žm‰ėA÷•3֓ xO…˜ņ‹å0§Nŗš^Æ®_…ģN@i½ĆSuĄĻOp XgZ)T²'vĒ„ńćTDļxt ŠÕyĻŁüŠxo^&É0 K/µ­“H1yKŹ®óūē:ę¼S-:Gj}ź„%w†PbGX[1šĆ ‚Å`IqU/8ŪEœé$Z„HŌĻH6ft•ęåWšwšgł>dŪ6ļ¶š!}xH×Ūģ>‡ĶÜnÖwŁ6Ū¬éŪ -ŅõGĪü7[ß-I2j…Ÿeģ^VĖ3?E ģ–iNĪ`!+Y=U÷¢FØõmŲ ƒ¶“ŽGėdIö褦rœś·ø%oHīG.5mÕVė6d¼ŁONIAīÆÉī¢N’šį÷Ēö+†’l1§{<•Ä Å„2HŽxŲĒ•wlŠ’G{q"·TŃ£ólŌŃ|4Ļ晱įĘüÆÄH=^–ybćLŻ0˜NXŲŗo@“䒐2čžDQ°Œ•{ź~Śnī6¬¬gp¹g' ·ÓļHd†gŃ“üŹ“ r#ā4.~Ān„>5ųŁe}q•0žÜĄōnyPīQEi–SL ż®€o¬’tAŸo„r$„Ņu±ŗūä} ~¢„ˆå°ĄĆ…µ"\•gq.%VRŃHŁ,gj°tĻįŅ8²c½pJ:LFV§”B#ö;$f®ßŃ*łŃ)ńn_ņ¤Ł[эę'›ģśˆš"|GłŁ„’Ә«^GōāXÕĶ'bńÅÉėW³qrÉč©—ĒĒ˜9Å<ĶfÆ’š}TaoÓ0żž_qź§¶* ā#ƒmakE“¢É6ķ£›\Sk‰lgYAüwīœ¤«¢Rd%õ;æ÷īß\Ōū:§Ó¦°”%B¦•RIU€Ū#ą×ģJ+«Kü„Ŗ¹–¢ŌÅ­(e.œ6 •C³Ī Ļ%>Ź •ÅœöšØ-‰Ž¹V„„nA„V0Ž’åč h…Œ¦Š•6#· QvA±Båģ AōåWė4¾ZĄŽˆ3>—¶ĆVŗ=ķ‘Zm`G„DžK>Z”Dœ>Tž Āä¬9ÓõĮČbļ@· -ŻĖšĪKYJ²ČŲ®šp,i=覗r¢ŗ7c·Tˆ%æšæ„1m`ŠØ’w49óčJ@iÅēź€O֎č±Ŗ.„P™G÷źŽgĒū¾ˆŽr’@x) w§Ū@8Fó°w®~†mŪĪ…'<צ‰įGrv•,^és£J“–ÜśŅHCo jb•‰-q-EĖōņ ­!ĒU1c“BpŚ¦gÓŠ$żtŁ&|FQq2‚wQ'3ø‹Ó÷ė›ī¢Ķ&Z„ń"õ®Ö«ė8×+z[B“ŗgä‡xu=$Ėč(|Ŗ ‹ąō²£˜ŸäiąĄiéūdkĢäNf$O( -żˆĘH¦’–[k‰dNńØ¤ó”² żEŪ0%—d÷—źG+ÕŗōˆĖĒ>)a((żŖ0ō߇)ų÷žż)„T2 †©‡&¦Ā…O ø†ŚĮSĒ±ĻJAVuŽC?–’«- Ž—Č_.|rØr{²ėsƒ–Żžigš-(ßąņo -tń]aŒ8Īvä-Ē•RW—ā0‡4¬—Ę£;䘣©Š·ēŻ:ÅoJōČŠÆu³„Į®Q™æų -tf<9 ‚ļApqüTQkŪ0~÷Æ8ü”„.{\ĒŚ¬m˜YIXœ¶”±ž8¢¶äJr]oģæļN±š°Į( 8ĀņŻ§ļ»ūNĪš]%“I˜Ė -!׏ ©¤*ĮķšG~”•Õ~mŃ:©Õ„•.oE% į“©š­ČqJ s-sT pŚCĢ‘Ó’é­ė„A˜ėVQ*AĮh–ĶĒ@Æh@+älB¬µŁó0rÓņÕDikTĪN2DæX®Ó‹+ŲyĪ/¤ŻēNŗÅH 6°%(Q’§ŚįDƒ„0ėĪuÓYīčN”±;ŁŠyk–’Ķ»Ē’Ö^·ƒ”#ÕC1Ną–€Xņ»é[Q'ÅĆ×x|ź³kуŅZ‹tĄēGt‰XŻTRØÜgź^Ī Ž÷ˆŽpAx) ·Ēa gó°s®yŸ$]×M…'<Õ¦L‚Ääš*»Č®Žés£*“–ŖõŲJC5Žō b•‹ q­DĒōņ ”Š«ņ„³m0Įq›E Iśq•Mųų Ņ,†O³,ĶNą.]^Ž¬įn¶ZĶėō*ƒå -.–‹Ėt.ō6‡Łāž3椋Ė@*…Ļaģ^®(G~ -Ų-CŸlƒ¹ÜŹœä©²%B©ŸŠų!iŠŌŅrk-‘,ȵtŽT–S’Ņ¦äœŹżĄPĆx­µ®|ĘłÓą”$äžU’ųż0ÆļŁæLHI&? 3LL…$ -=O ƒĒaš©%<łšō2śy%؊ukÆ£Ķ’՗D/É+.|vØ -{łGDō3ŠČßąņo+t­į.;‹ZGsŃhj—üŠVĪ²e7ŽM%śĆrØĀŽÜó,āQŸØ1|ėæĒ{×4ŽöūŲ»"V“’ķ}ķųŸŠö(@ŚÉ¶Ä -s2żtŲ ŸĪ§øóm“ē<ģ„ųÄÆM»!CĄ¶U¹o]‰nå£3<ŸFæ¢čģcō½VŪnŪ8}×W „<$cu÷±©]»¹`-ģ"r[‹" %Z&"“Z’Šā¶ł÷”Dł¢ø[ģĆHd‹œ™3gĪ żęm±*‚čü<€s˜Æ„„Č9$JZ&¤»āĄæ%WJ•ókĮr•Ķ -+š;$93¦†dū^$\ž‚UĪh\°±ZŚŠi·Ŗ”)#C8Ē·g€_¹%9Y+ k„ėøZ,J‹/ņŚ#°Ls¾ęŅš>@Ģ¹s?Ķ'W7,Ł§ĀŌv v…g0•JéX¢+–¦‚B³„Äk„ 5Ļ˜N…Ģ0t±Ń"[YP•äŚ¬Dńę”J|ėĮ˜Ś±‹¹nTŁ¤²“uCF>”#Jł÷ž+8Åd6»įŁ„³^³ He”4|ėųSĀ ‹pŲŗČ“‰³n²kc Ę/µ šs©€ZīfɚžVÖÆ£ØŖŖ>s€ūJg‘O1zĢNć› ķm>Źœƒlż] -/6Ą -D•°bĶYEt…r@•FĘeÖ#kćE°[¦-i"¦¾{ic®Fį8†IĀ»q<‰{šy2’cöqŸĒwwćé|rĆģ®fÓėÉ|2›ā·[OæåŸ“éu8R†”ųS”) D*ˆQžīčÉc µ4u2OÄR$˜žĢJ–qČŌ#גÄRp½Ęø6`2Ey¬…u¢2dŚÉĶwÉé~ WMCĶ•ŹÅč±QJ1T†rgY¹-ßæ^¶ŸéŠ¹$‰UźZS#–$ÄLQ.Š¾‰?Ž1ƒ ØŻŽwĪG©ėŅš…¾WĪØŠ -Ł²›ŽÉ'– œčģäѬõé5_»Eŗ¢Ł¶wźÜō÷£~°@'u—wż©Ņ„…zŪ—{ßÕ/—ČÕ' -jVŽMIžd¹LŻ>’É›×Į÷€9–iĆ‡:Į‰»ś•Žv—ÖlsZ§7®ÅOĻš‘{"–'Ō9'Eė aąIėŌCś<B˜ņ%+sö¶'ZĪC:!Ė.7®­Ž›–4Yz”d¾ūå€SeŻ-Ų†ƒ#ńœ"¹q“¶‘č–X’‡m$‘I¼7÷uąŗ–„L\ū{Ćķé>ķ½C6k)}o5`°Ķ’˜5ĒöŅJ0ĶVYÆ÷¶h‰%zę¾VĄi'8 X²üųA:ɹ|įŌųmĮĖHür%É+_ē¤„ž_ųčAXcķBÉpā įUHpē¹óf‚xø|žm[aؓ2ž³tńcŸž»ģżoģ…óßIjQ—›Ų£ Ցė6ĀĀ ]ĆķŒükĻč+ŽĢżtk'ĻĮs¼’ķWmoŪ6žī_q0RĄR»Ū¾%uZ·I0cŌn‹b+Z¢d®’Ø‘TÆķß)Jrd;ŻŠ}(0‰"‘÷öÜswĢÓgł*ļ ;p W"įČĢ0‘‰,³āĄ’ -^ŹLĖ„’Ź³āB°DĘ³ÜüAĀ“ $ æĻ4ĮH+8ĪY€¹ŒĢš)W²ČBF‚ŠĻÆś€Æ\Ģ8IK©TĪŗĖĀą‡Äi+ĪSž=˜snÕOg‹ÉĖKˆŠe’…vrčĄZ˜žÖR}„U±0dš% 2üZGHPń˜©¢ d¾Q"^ėŒ+½9Ś[P(ó+ļŒvŠ½YŒu#‹2”FŌ%'šQČ?ž@P·ÜķöĻ¬tŹ6I…ęµvąwĻ ŗ‹Ž„y"XXé2ŗŹśų¾T"—”9`6Qó0CŅō°2&?×ėõ€Y‡RÅCāš";_>F§½Ģ›,įZ#ZB!ĘĖ °½ -Ų}MŲš2he €^¬"žÅ'$­= šiŖAó.bčĶ³9źŽē0™wįÅx>™ŸĄ»ÉāēŁ›¼æ~=ž.&—s˜½†—³éÅd1™Mńķ -ĘÓ÷$łĖdzq!CSü.Wz*Q6ųä} ¶”yŅ9D$ /‹ sˆå-W¶4r®R”µ-–…HTK*M¢­Ų|•ķ¢ŽxõŅ+Y$!8[H4†§÷ŚÕ”ß²D`³ÅpŽnżŸm7«-ņˆŗOŻ9“­M&/ŒG“¬#„€üX–9>š(ˆ&ĻBŻā[¹ßłŌé9ĖVZĒ–gF„d|]qW.’@Čž˜7ĄÜŒq"Ųc"%SĀՉį¶"bm ä+3°‘U¢ÓG¦!°$Ł@ŽqŁŃ€-BÜņ¬ņ¢œ…77š›^Q5+i$¾ÓN -^!vL:éGŖūčŸĻĶJɵ…+”_—)™Jc§ź„v ¹ó~Mp؍åXP÷C˜0P~‡É >½ƒ=¶I?hĄ©p­“U -©›#%h )ģŸ¼63ÅRuĻ‘jtžŠ;öįČG°ć%Ä`ö›`"l^ĻŠ>ób‰ż¢" lonŖdõŹlV:G„Ķ>ō­ģ§Žćˆ8’ų¼t]pż[—šM÷Cƒā#č^'`%% Ō²»g‡ō4ŪÕ‡zż¤ūšH’ž­;LéŠĪķ·S8,Y¶`dkcWå]8¢W £×Æ5c¢"§§[ Vp–æ“JŅÓÓ^xÉ»6§ |Wń“™²/wō«¼æ“ ź-cj9ĖSßՊjŽ·Ä(©ėj®?ÄłŠēt…Ć*k”˜ ‹ Ė,Ł[W{köŲ³Ķ”k{ūjÖŻ#ŅP[q†ƒń:”Ž“ ūÉ}4ļ—‰Ęł€ĆńžXylū(­€ŠÅŅéÖ-””o\ž{-Ó0 b Ŗųü™X’šlĒ©§šCĆžn?ü² š…Šīm½B“¶Qzų˜Õ»’\×Å|RŒ÷žtwn”¢__Z_–Hµg;€o“o‚’;…÷æ€t«™’Ŗ_ßj=¬ö ŚRą0¢‡qB¾ü~׈ ķ_&¢¼Ö¶®Gż×Ģ…ŚL­¾} ŁRņļ Ūjüõ/ĻĪ;µWmoÓHžž_1WU4©BRųŲŅŅPZ]t(9‘BE{ćģÕŁõķ®›ę ’żfĘ^ē½Wg b{ē}žyĘ}õ:›fµöńq ŽįF„"£½PZéüT‚ü'ŗ2Ś™TösŸå¾Ÿy…Ļ„Ā¹j‘ā;Iķd Ž°R'ž ĢÄĻ…•pcr R„zgpÓ|”Œ–¤m,ĢŒ-<[5Ī=¾H ‹ +åLjļZ)Ł|Æ?ģ^]ĆĆ%żX¹B˜+?Eå`nģ-LŠ”ˆcE®E -Jć‹BŠV&Āʔid²…UÉŌƒ™kiŻTečoH© nB0®0Üb® “—©¬d]£ Ń„ü²uu „ƒņō qĘŚ3±m<äN.­ƒ¼dę1\ l–„J舵Ėģ*ćēŅˆS×@p*`&«b čT:‡Õś;Wk<^€Č0ŖHŒ1ÖTĢ©ƒÜ(F1·Xq4IŪ¬¶iY“"¦¾*€eÜ£ƒĪŗƒxÓtMųŌžŽ’0„O÷ļ;½a÷zż÷pÕļ½ķ»ż>Ż@§÷™4’čöŽ6AbÉŠ•¼Ļ,%‘*Ŗ،Wšb “”}r™ŒŌDE˜žNr‘HHĢ“<™“3叁Š1Āc¦<ƒŹ‘źVnaJ.±Ü·dŖØ”1)k\Ž•Hi·¢?Aø‹¤Żę£0OoŪc8d“1grĖ˜j×Āō¼Ķ#_ 6õŃyJŹĆ”3_¢j“Ö¹`H(.Œ°·f¢,1|ĆÄōķ–©‡u[—™5Xmæ@Py8Ä2S~ńNŽÉ“€søŽJOmŃ„æ”$(ąJ§µĆ U{l„øŻg« ó©dyyļ ¤¤B ‰4] Šq®b‚ ÖĶT3ä?OŃDSaE„²xX±8ÄŻ 8é©ę'ėź±œˆ<õ&K"©©4e¾Ė„ļՈ6²#ÄąÉå†yĻ­›’r3Ģ?7ŅąŅ˜ —V`€@.ƶ]+°oy`-„Žłüp²|]ūV£ØŽt³»•“œ/8žKF‹i\ קøk,¼¹B¶ŽD|i 3LÕÄŌ…6‘P•šÅŽ«ąŠ7·H»Ķ`™ˆÕsG©—ą§0BŅØ0Å„8:ĀB±8įkgÅ „µbQ'‚ÓÉłÅLŻĖø‡!!Ś4øs½Ā%ŽŃŹ*Iø“ŅēVƝQńFā—~jĶ¼*ēŸe÷{Ęóā½ęmĀ;ƐāNpRw"Ķ+śƒ -=!Ģ“0'tØUcódźG<Š„?ōcrž‹¬+CźmžĶņ1²Lrń‡ÄhtŌ,QĄ‡®Cźźó‹Ņ°’īĖŃ:w}…sxqö˜BÅ ,{ņØģrĄXƒ’+ņĀ&ßRä£Dś=×K5zqŖóYy -ēē <{†EŲ) }9ł - hTŹĖ¤¹Høhµ?=]-ĪŠŽŅēCu'S'÷XĆöH\%PšįąPÅp~TŒ@m¬ Æ«Ņåšs„ŠF„ĘÖń¶]bNNwžq5‹źF8u8XoėA³ŒģlÆ>·t÷1»~ńd×@~×—Oöŗ„ŚĻ»}Øķ~*īj›4…æėšk2Š$ļčāō—°P,[V\€|Š¬]®ŗ hķqōĘŁ²^ŠĻ¾Ł`ī‚³į0(÷Ä ’”’Ź•ZŠLņE˜ąw³ģRK%ī?HQ°Ksu—Cµœ¾µĄ÷1Ćp“%Owˆ,yq³Ģdæ!cį×U½ ¾/ī^ĮɓY€;Ģ»vg“wV  GōQwd}“k(¶Žģ"Ē>$IśøŖ²üŸ3#_?ŸUł¹ĖV4{§v G»vÉöj\S¢ŻHłœ•<ƒLóś¢ö/µXmOŪHžž_1H\H Ru§¶P(%jtUØŚ^UUÕĘ^'+lÆĻ»Ęä(’żfv½Ž8\iKˆÄ;ÆĻĢ<³šāe2OZƒŻŻģĀP„<k&bĻ@Ļ9š¼S+ņw©œ„\©)KĻ-š%x!SŖŖ¤żVx„ėÉd‘ŠŁ\ƒĢcžŖ¹HŠß„2ŗ`”5ģÜb® ™©T².ĄčĮG4D)?éļĆ6 -R»8mļ<7Ś[@,5dŠ/­æöx¢1\ ,JBĮbĻhŁ•>0ĘĻ…9„Ņ3©€ ŖbĄ4iÓĄ\ėäŁ`ēyŸ™€ū2 \Šƒ·ˆģxr¶‡A;qˆµG“žĪDŠOĄŒŹcSŒ5d9UŠŹ4F‘§ˆx<ė‘¶rMP-Ó4"¦^@Ų˜©Qūd£I^LF“|]¼9’pŸNŽæ?_ŒĪ&pžNĻĒÆG£ó1~ĀÉų3iž9æīGČŠæN؁)RAˆræŅO.ź–¢N*įž„‡éųŒĶ8ĢäOĶl$<„Rf Xģc{DB›¦R¤ŗ–››’c„ū’LSu!eh4ŽÆŠN v’ ŪĶsäįĒĖvW“ŌbJf©é©AĖQĄD§™§ķ`S•¦”¤Åׁ²lŠ7T²ŲŽ$¾}S\o› zĪöŽ‘¼)ėŖpa 5Y©ā“.A‡A»Īö³†³r,O«“Ņ(PŁfŚH6Š”³ŠxZĮŹ)="@„śf«¶]b‡‡‡¶ÉįūwŖiČćŹé 8Ø ÖŒœ{Lūį^Ģ›;°^„1…Ņ3Ķl°ķŅˆ­Z½]{3ÅėŻåó†ü •lŹż&±’ę[|~O,KŚĀG‡šōW“[įŁĘ ®Ż”›—A(Yõuš‡k ģ’"2uZ’©źļ?tõ=ĒźjŗG…W²¤Šß•s’Š¹ÓæHŒ§ŸĮ·7æõÄ×bŚø^ż/ /=oŃ?ŹöŽ–׶/$ū/o6«sŪŗmµ^µž•UmoŪ6ž®_q08 \kŻ§”­ÓøiŒėģ"r[ĆŠŅI&,‘IEńŅü÷IŃ/u»­DEā½<ĻŻs—WÆėUÅ\Ą„—©†qĮEf…€§×RhYā{% …Z’.7RĶkĆéŅ’i=$wįOQhĢĄHē=®YJDę¦e -a"‘1ėgćdrōŠ -¤@ė-TRyŠ/Ź„Œrc…Āč!@‚čĀĻę‹éõ ä„Ūśg\{?Šr³"®”•j 9…bYĘmjVō”r@¬£Ā‚©ĢRNe½Q¼X­@„W¼¦| K%™0Śi‰ėF6•=Ö]1š‘YŹ?‚32°N½ī¶wžŅyWlBh4ī¢>¤X‚KĄŖŗäL¤Ī»c·ĶA?wAäŅ¶˜£2ß7f¬·żXSæˆć¶m‡ĢJUābüŽ*;KnžčąóA”ŌŖÖ_ WTćåXMØR¶$¬%km]£œE«Øā¢XoD°ß¦]ŃD¢¾o@ec®G½qÓ¤oĘÉ4Ą§éā׳‡|ߎŽg‹éMó[øžĻŽNÓłŒŽ&0ž}¶žæMgo€T2J…µ±EŹmE1ŪÓSĄ`ÕŅõIטņœ§DO + -yŹĶGŖāZ»1`"#yTÜ8QiėzÄ-LÉ•{mCu“µ²tW÷Rā˜‘ś ’;+āŲ]…Aų’mū7ŗVbZ6Źi*ŽĀHŒjRćŪöQ;”–‡ģf¾SÕn7ĢS7f· hbx·¼»>šļź ÄJ¬ā<.•«ZI*µŁ€•ÕżÄoāŽ¼˜Ć±“źoƒ1ČP§¤'ĻĮ „ŗŪg“sÜB™’@{\oāČżĻU‰Eę ß0Żēč1²Č ŽĮŌJž¤ćĖ©j#`J±ĶYö÷¹÷at żÓ_†ĻóÓS8ÕōÓ8Óó—‘{ŗ–Śs>IZiŠ®Āž.<ÆĢJÉv‹š}Wų™4nsßøu䖦·gšÓĀ”2»µ°mW*›2s[mi»B†ßIō‘• ž`ō{ėcׅ$å‘" (†Ū<5S¬Ś -g˜± -ƒ‚C°įWö°š)œØüŸAøĒ~¼$óī5öm–4–7"u•æ»ÓhĪˆAˆ}ī,·ķÕ“ŁÓx«īöŠĀž”J½}%ō^ŲĆs -Ćõē~¶Ķ£ŃrVRˆ/_leJ{·Æął^ŽoēĒ5¶ßīć!×ō=”“VµŁō­PæŽśtōe©­ 3ĢYSšcŚG˜¾+āPä]ą]ęū?ųŁån’°¶Ņęje7B#\Ŗ2Bo2æģ}E *G¶V2„}Z.KK/RļD¢3Ģ­ĢūŁÕbśņV”6ŪĒŅx;J`#ķšöH„?ĮŠ\‰8–Z¤ sz‘¹DŲPc"tĢGŖŲj™¬-ØMŽŚ¬eAń\Źü2$c¼ć–jŻŖ²*„QuĘŽ‘#.łēįcčŃ6źV«Żžg‰-äŹBipēš6ĀĀRŗ”XV¤R䑳®Ŗ«cPŽ*'jÉŻįJµjnaŁšÖÖg£Ńf³ -—šPédJ½&dgó‹G”t°y›§h ”õ¹”š0^nA”U$–”k*6ÜA×(GŹb£ ń<°µ $h¶iZH‘Jon Ų„ėQw2‡é¼ /&óé|ļ§‹_®Ž.ążäśz2[L/ępu /ÆfƦ‹éՌ¾]Ādö-Ī^ 2 -…·…ę"(SɈbÜąSȁŁRõÉɕŒØ¼<)E‚ØŌn< -Ō™4ʍČc¢G&­#•aÓVmaJžܟŲU5X „Rgńü¦bŹh$ˆż Ń]$£‘[ -ƒšćm{ˆ‡Ī%SĢØR;N:A^CõŖę|;DvJąĄčfŅ×< <łõ¹ā¼V„§Ż÷žĄ=±xk=SĆĆcų¹!Ö`ŗīŪ«w"•¤;TÄÉMų³ķ»^böņ īD$vnīD[R]pbÖjs¦L­ŁwłćČŗHi6™ …"Ęš¼hoć˜Ć 1®½* #N}x?.^¹ŚŁ«Ņ„æ(ÜH|Ōń­<&č;ę±iµ»Zļ|ķt8¤# ?§®ĶV—‘%ÕÉqSSG-’¤J†a[ ¼Ä{ń•V”P™Ń²&ØH[*@†®ŗŚ€ēż1…XĆ#‘¦[(Ø6§Ģ4”ņó:‹ź(śųŃ ķõ!£®(§OōW2I°xg8ŃüĖšłÜ®µŚ8Xh@šMՖ™²īP»pJķĪæ?Š·¤s4=Z<<‹Ų[āƒśž÷Z”a<®ųß¾1KRĢļŁõ~jÄæ?šø„Łi+Sļ^#~öQ:¾Ķł=¼Æėk•”Š}»÷nn ox¾·Ž,‰jŸžÜ|søćĻ·€Ń’ÆŠ}˜kčr&ŻYóN+TÜ*U’°ń’%¤6ĒÆ_’ .GÓśē Uw”6V;å’™hG×hKļŽļ²iŸB{ĪłŚwN:gžwž•UmoŪ6ž®_q0äeŽµķcŪ¤qÓ3VŲCä¶(†! „³LD"5’Šā„łļ»£D[ŽÓ¢%(ļå¹ēž;æy[­Ŗ(>9‰ą®ejå„TRåąVų_z©•Õ&NøŚ.„™UNŅ'H aķˆŁ÷ƒLQYĢĄiļ7®DJD/]# Āµ®U&ŲŽĘÉõ1Š+Š -Ł[(µi“¹Ø}(Śˆ rƒX¢rv śšÓŁ|ryKBĢž™“­h¤[‘“ŠhsK -%²LrjQ€Tō”ō@ŲŃ`.LĘŦŗZ™ÆčF”±+YQ¾9—’\0¶ ŅR­k]w„ōŖīČĀ' -Ä%’>śŽČ€Żķąųµ÷.Å”vP[ÜF|H±r—€•U!…J½wWŻ&aüŅŃ n_ -čeß „cožX9W½Šć¦iFĀi“Ē”Äų1;M®N tšłØ -“–Ųś·–†8^¬AT„* ĀZˆ†;čå@(CŒ«|ČŽ6ˆ ß¦-i"•Ž7 Ś„ļŃ`œĄ$Ą»q2I†šy2’cöqŸĒ77ćé|r•Ąģ.gÓ÷“łd6„·kOæ°ēŸ“éū! QF©š”2\!•Ģ(f== ¬–®O¶ĀT.eJ婼9B®ļŃųÉØŠ”ŅZ?Be$R:/*Ė®{µ…)¹ ŗļ8T7Ss­ ļqqß)%Ž©?'¹‹<ŽżU„oŪ÷tčC²Ä¬®×T…8S§®lī£u<”\‡īf¾SÕv+ĢjWÕn» hbd·Zw»ćßń T•ŗŪ‹ó“»T.*£‰j·–ń~`ė4„&^®„iµjJ_Į®h~Ū©o‰Éśå5z9čRČ¢6ųƒAŁz7āOvÖ·5ŽZŽ¾³_ńĮ”Ź¼É;a±ū=F Šp˜ņœtõH¢ś „1b}… -{„ĀŁ9 ~ ··½ŹŪŪÓīöųuäŸ^|N Ķļ›Ö‰: -wįyįVF7ČuLOµóū’Ź/5æz[ūp&K"6Cė—Ė¦?©®‹ĢļĘO&}#Ń'QŌų“ŃļŁ‡—Ž&ż’® 9†›<•0¢Ü(å×0%†9ĮFĻģKłĄiSxµ’łļūÉ\Ń°tÆqŪāzAĆ ĖZ„žłŪ[‹īȃ†ŲĒŽņqÓQKæé -Z«īvׂOJ”Į 'Į«ī{āxvĻG.)‹“·-5G@pvvF3RP„Æ_™øUļö üփõ2¼p|Aaór›w©’Ö=””W –•[²ŽŸG}Śū²0(īv 3\Šŗpūeļaś¦ĘC¶·™ų‡žō|;¹³ķ?4æm1­ĻSōEoĻ£’åY[sŚH~ēWœø\d Ų3{uĘ&ŌzqŹąÉLMMQŌˆ^ ‰mµŒ™„’¾ē“ŗ‘%“—%e[ØĻõėsėĪ÷?Ģ§óJėåĖ -¼„®š98a ˜Dąšrąæ;×a…>²±ĻļęJąWp|EMd"¾[įš ā.ØPó“ēĢĮ?ƒp¢Lrč†qą2b„Z{Š­~åĀ€w(aŹD±ćXį ?‘Ģ“œĻx ¢&Ą€s-¾7ģ]w`‚Öæ+¢„ X5EĮ"”0AQĢu©f>ˆ_Ģ“!Ä(¹Ē¤KŽ:į|)…7U..£©˜£¾!¹2čZc¢D°U‹¾.ĆŲø’ńŚ€Ń€ŸP¹ümó jH@L'fõ¤žZsĻŲ‚PAńT:šg‡Ļš‹†Ķę¾`£¹wkhć/FH8¦M¦]p’%¦ˆ›~¦JĶ/Z­ÅbŃdŚąf(½–u±u‹ČöWh“åy|EˆÖb!ćńŲ­r(Ąg ŚA½Q:ŠŠ…DÄÆAܑ ‚ģ6„ YŃõ,ĀĘō“ŠœĄŪö 7hĄ‡ŽšŻŻĆ>“ļļŪżaÆ3€»{ø¾ėßō†½»>~ėB»’ qž³×æiGČPžKr-„(w3ńdm h1ūĶ¹#&ĀA÷/f/|āRgŜĖ™ˆ",p1ÅS0eOœ^aRb µa”e |¤TM”Ł¶ŗ}Ūū±?ŗķt‡«F^ŅnŽūŽļ†k?yĀ‚96ģÜÆ2 īÅvÓé¶n·`M6^GĶ{jR——f^‚3e’9 -³Xx$\s³6ęjĮyŲ]™)FŠöO‡óp9ēy%ōĘ&¶'žP”ŅI­É”6ŃÉGš=‹¶Š'ęĒ|3ų­'¤« &óój®­“ļ±©µ®d ā{2,ĘxčĒ¾Æ+ö;gŠÖMvč{Jń;åÓ!§k¦ƒu:”Ä į]¤®Cō˜|ėźewĀQ9”|I†›]Y——sbtœ`¦éČ ŚmŲŪPbŸŪiŽX“™%ĆE¶TĢŖ1$//'¦i§’ŗ©n„­JŅ˜JęY,ĖAÕ!œJT’D¢ö×ĒRmØ%ĽĄxbąÖķVR?ā1:0‰ƒdJµŗ¦ųøŽĻS&=Ŗ-D<ņøŃ÷F£%Ø%«A<3«pyy ēšĶ7hĒČ «ZŠÆgæAŽæĄœj>ł5ü·Z”­ĘS[ ..²Öf8S‹Vė'īG¼DāÅń\FUśSįRā" #¶YécśeM3Õ·–·č汖ĀŁEįšĘš2ė՛ѵ–)ß cÓėRĪ1:óX¼¬•ž¤”ZĮń:æŻ[g®ƒÆų»CœµĶēxµŽ[mŚĶŽ×ś—½µęŚąńŠ’zāLg=^õßŲ`Ż®Wł÷CƒŁtņć5’ćPĶ¹IāÖæŖKžV[ƈķ’ś²s®oO’Õ/ŠZø<Ņ~ė&‡CŽ)ŌMĒŌQ@³DŃgiō¤Æ–4ŅqÄF,sŸĶ8č_f² Ķ Fs›D{¤§–āį!åĀ -‰ė3Ż\‡CĪ–F¶«„Ķ)ķb9ĆĖ:°ŽĒ“-m¦ž2-_ėŌĆĄ„a+¦ĘÆ×øÖųZ?½@BsuVß»©źÖ3fį^Ń@5ŚDAźtpBZOŖEy²ŚzS1)2Ō;K€YūX~¬ŹAQ~‰¶ŁõĆš†pĒép‡ķekhš±ųēꈃ7!w9¶įō$»]rM·„¾üźŪ–s¼`{2ēöŻ.–.kæ¾@vŁa­do_l—–?ĖDŪ±ž„óąį•ĆŽw|¦$h²nļēĪĶ×Æ -ė+™v bn¼½(!Ȍ”E$f\,Ł…¢Ö•ö¶OŸh -šy°^{”ĮłöŠ}ėW Ź -žšāŁż\’©žBÖ —åĄ(}O}m@¾¹Qū’ ƒĆ¶ė[¶•Žś[ĆgŃEŽ9餷Żæę˜~C/Č»×ęp‚Ē“ŽTž ķ\{s7’’_Ÿęé–djLŹ±³ÉJ‘bő²Ŗu$—Åĵå¤\ą$g=œį fDs}śīŪŻx 0/ŅŠs[Ww¬Ä9@w£Ÿ?4@}ūŻz¹>ńÅū‚]F±`ašäYc¾A ’”Č@ŠMOĪ–Ę \3•J3"ĀŅŻ 6N6źß²«Ūūžüöź6`o®&½łyĀŽœæ~}~=¹ŗøe7ÆŁ‹›ė®&W7ךī’_’gžķźś‡€ P°Ö.$P£bęų“‘½EŪI®EĶ£–—, -¾l‘Ž‰Œāa-²U$Ń“„œ{¬¢œœJāŌŚŚL”<uæGR:’&iӌēwŚSĘcŽæwē‹ń˜™@Ųßl]~H$ŃÅdZdäSćö/0¢IKXU¬Ā‚e)żYĒ¤5°u–ŽE3z?ČE6ē”@§PX.>ä&Ihā#v•³™ą±Tī­#øSįšØY4Ÿ‹ Ć6|«Ōžā'ük…“V0/'‡L×d -dƒdmܘÅIE߆éLœįoć1{‘ ž+ĒŠR“>D†Ļį#vŹ±©©`0<1TnEN$Ą“ÓTFłå‰ÅˆŁ“#Céń™öń™÷’ĘœĀØMź"”u”k@dAč”r ĀĮDØé9ؙ=;bį’g<„7²„Æ ōe†²}ä¹YF¹hą©Ēx–n™Įkéœ0 -š³*ŹČ„ĀsĄDš @u}7Øź*­š¹y½P0©ņØŖ*°³ŪÆśJ@_‡m}7OĖVVWÓ ˆFČRaĀŖXP‚ųDɳ… pA.ŽæČvg(Z ’£rZ š# ž -ŸF1ÄŹH“ÓO4nĪ&ēƼ˜¼ƒķĀ+Ų1œ²ģqB+2½“O•bÄŚyÜN~øqyČ|–~2‘ei¶ƒĖÅė×˜ÓĄEŪVE×J6Y;J$¤g†?æć™®šøK§g«čƒ˜ =Q`z.BŒ‚Ć’R÷›„ GóŠĘš³dS(%°Ō”6olzM{¼Jå`U3_¦³QUD)ź›Žććrž·–)8j«ģZŖ[%Ė)¤ĀXŠś:č¹ŠŽU‰¹U½C #õ>&‚Ķ„ łZ˜‰&w`‚,„¬­¤®lp„6UKÜX†ģŠŌY5ńĄ1”h¾ķ—A}zʞåći ÜƗ'+āļń—Ī歈ćtÓw?õdäąę<^qŚ÷Ē_9Ć-O*³’ģQbć.ƀ5=«ŁœLMšmßhs×ufĄgmĪ€ĻŚ<Ÿµ¹>kó|Öęų¬Ķśų¬Ķōųģ/Į§žüwŲ]A-»'kõf½²žQ_-ĶŃ5ķā¼ t­P0ÉūÕ®-Ä -qæ:ĀRŽrĄŠauģSZ^„Ōž6Q£n{|'tm›€«½qHķ‰Ļ°J‡+!ōŪ¾Ŗ’[KgŁˆå¬„“ž–‰čՄū²øv$ČWS·ö§>…ĀćŒcå–tff!8ĀŪšBŌņ¤%vŪį Õ­01¤ne)åĖ %RÜ Ķäøū¾Ns:l¼ 4:ēÓč×Õ\­!‹Ōiv\ üÓä±ųĮĘrā«jv™ušłż‚ƒŗ˜Ń²Ż&j›č£&‰•ĪŌĻQ ³\pI²˜®"4¤:ńcØØIŅLĒąF3¤ęp•B‹9ŗ#4׹˜¬Ńœ `éļ4XqĖŠWß!ĻV²zs(ܗEŒgŠČŪ4 -€õ·¹ßƒDĀ ÓoQż£Ļ[ĢƒQUėŌĻaä_Õ±x&ŽU¶œ- gˆNåæ{· ZčIR5ƒÜDyødµamQbgŲščøį™©lž³N“{¼;ń&ź SØ4Es-d[_[õNĆ[¢ārŸĮŌDå‡P}Ō½U“LŖĪŚ«5¹7w -^•øM ŚÕX”Ś*ņļĪ¹‡ §ž#Ü^A$kA(ż‘”„/*ŠŁ^•qX£ń±ö ¾vµ†å¬ßĀøļ2óŗÆ}²«>:•2Nō֞föÕŪ„Ż#üėM3~øŽ¼ĶĆŽzū·dŅŚFęUYL ×īTŖ‹ /°I¦0½—Dą=0XŠ|į2<]ųÄŅj6š*®\m…M»h²¤~¬ĻQŌ³ŗe؋Ópż«Rqōõ nĢS»,67[ZFfx§Ń'ģ}r1 Ōł®¢eī؆)žš.S)’»„BČńz³4ÅŻłƒ°VĆÕ”“!ÕŽš¹HXœ‚½ąŻó“žļw•-[Ūé²w<õ#CIMWõ…µ¼®˜K—ƐN¢]šė7²Żŗ•I#g†Fe±PŲŽ:ųW€×°Ā„¹,Ķ%"™M}jČŪīĆ}–N’!B,œøM0Ję±>~w¬ ū ÜÖ®×–©Ė27—lŲ@Œ#u<7d\²ˆcüIx[ŗ–“Ģ¬HŚK`EC²; ^ČUB{yµu°»«°ˆīDbät«f«)ā”‘*¹)īĘD¢Ūvśŗ-s~Å«¢~Šźg> -GżBõ›š$•T¤™¤mD/%©+…¦:njf£gVn¶Ü$Ś”Ģ­™Ų\x1·EU’‰LUKĀwid¼¶9ŗah©ž“ ¼ &Ö){ŅŅĘčnLTȜÖ(·¢5Ó$-ķāR^ä²?żiļĮgģ؂Dź(„”ō’ņĘ)R,ŽÉuį5¢ĮÆŁÆÉćŁ{ä( õ¹*J%-ĀĆh†ēöĆ½AQIę-Š@H²I³^‚uXūj!`ÆžśźŻÅĶĖ€jŁ¾ {J×Ęә”4œ5V(łTĘcv…ł’Å?M2 -ŠęŁKLh‰½Qw‹G Ø5źC·ś­½‘§]Ū ų­†<ė -¹žS “X«Ėń˜”6œ.¹Ų”[9ź^ -}E›'M“„ŻzįŖQ3tžōuœ²ēsĢuvfŪŠ€õ6=ź+žžź[ß{¤÷Āģö­š(ˆ¤īĘŹ‹4N·‹cvKWŖ)’cåĻ«ō4ŠU¤ĄßZ`MŒ%ś($:#G¤ö±Ā“–ó|žØīŒŻVHa š@ÅŲ'$²sj}|²o¾Sż’Ršŗʍr -Øŗj±m¹§­ļŪŠÅéĪ&fKüFČć˜¾č#č¶1ž“«Ķ\:§D嘌VQĢ»nv;Åy:²€i$ŠW„SN”+ph¾"lCœĻĶ=iĢĮå °¦H’¾“ZˆY½E€ Ķˆ}/$~ƒ„Ä< ø]ˆæ£bI‡%ź†ˆs"$“ÄętZćūnUž?˜’CĮ|[ą’&§“p¦ß’8\AĆ:ŁÕ69čČž -nė˜³&ćŪ`Ēņ¢µ²=Fh%föi“wJGµŽTČ\õŌI-ą`<ĪŌ^Ė‘ŽżZ©½a®³™ -ŗ€įŽÖdh[ūķ×&Ś9ńK˜[½¤<Żį„¾ƒŖ{ō-Īr—hŖéROÅ„:*®ćMõ}”ķZé¦ß„ąĄRHØr0ģī^õōµ’^ĒéO­¶6&ż£iÅ3sUią ‡‘õģę‘ĪZwŸø:7 ĶQ'ü”˜-ō­äŖÜB½éœ ¾2¦śs)N ĶüVŸ9ģŻéūū –­©)ĒeńKMꔟNųæ›A…d“Ó£Fēx¢śŽ‘“‘dEÄ®(¬£ŽŽŲ79×ƛöåĶ¾ōPŸu™VĻ"EÓ¾īłžc°nõ¾xS“)™Iel¾ĖÄv¤¶²g]Ō§Rž6ģ®ö¢k՝¬ėō•·ŗĪÓ³$m·čž¦tżī³ÓŪ£TģÖ²Øć’&ģßŖØAēĪæt®oz»]ę'-× 0ŗ_D4T¬l%4Ł±dÕĪHGī$ŗšČ±A„ó Ę~ŅŠ Īh’/Ō`÷bµöjŅ¾ī‘£¢–b{/īóÄüŪšÓż{ȔØÄßt7–¾Ėē]ė²Ź.æĶīßšjŚ<Ķŗ¬źÕ,®3(méĆ ‡ ō =ćwOõלtŽ@h”ß`Ķę«Ø€“px­/ćė­ųd»hŠŃ ¼mC%ļÅւf-2nmŗŽŚ“§ŗźh¼ ¤ÆÉ[—Šä/8ÖY‡’4PR“ÜŅ]7)ā9“4ćž-Īųm7‚„æ˜R¹kķ[Īlßjµ $Płök…^`‚–rŖOÓr÷ŠFŗ×øk¤ēŗĒŸ¾„pØž„/RÅö{ Ö- ĖŒM±nžÖ‡Ö£ŪČ©ļ³›ząßFŲQ°įėp•ĪĄ@ų—%œ{ćöiyŲ|#ŽĘ™ --7ąœ‰Ngܐąöžóć¦õp`oƒwļĘöX¦‚ŽYFļpæ4MõDåfUo«[u¦ōĮ­SŃ 1UõōEś&”Dvb]„œ–ARKĮō—cŅō}±y¢'ÅJdčfå}6[|l€<ŠµŹ·$«ž¾|Khõ‚:¬ĶlŸ  šœfO°š;‚.Čj-DUgļ€*ī£ŸL{>×ņu\„ihyÄ:öżĮwg’Õ[ėSG’Ī_Ńį ’!‘¤R•ƒMlSē€Ė’ćJŁ.j“Iöu;»Åń’~Ż=3ū^IŲäĆ© -#vgśŻæīyųń“hķ =ŚGpīzœ0H„øĮ’…ł—ó, TčÉ×q8„Rƒć „8‡¦½r(9…$ä)g‘pš×(œ%KK8Ó`*7  {6:ļž)cI³Ćü0Ö|cw’&ųĄÓA CéĖ Q€‘”Lžņj|ńģĢPXš?u•ž‡,Żdc\Ė0¾’Ó©K¬…n€|„&Ęr.ā)éé„Ń*vē‹Āe cµp#ä7&UFēV„ [¶Øė*L*­1śš;"•BŠ¤]óv·wĢ³}±‚ L U2§ņĪ‘Q‚ā¢`~ä¹"px¶Ń.ć2žaˆ„ņVĀYqˆ„fÓĄ"I¢£įp¹\ <泊Ŗ8|…–½½8@”ķœ·‡NGkż7uc“ńd"B©1AY=±$²£8PŠeŒę}š­lŻ”ĶŠˆŖ Łūh÷l£]ųålt1źĆ»‹ńĖ«·cxwöęĶŁåųāÅ®ŽĄ³«Ėēć‹«KüėĪ.’ ™’¹ø|Ž‰&CVņ.¢Č%I]²ØœāÉŹ@Ńbü¤"éø3×Aõ‚y*ęęį­Œ9)"ū®"×*rŠįį» •¢©5Żl–.Ńą.‚'cģS4„įm­aŠ™‹æ–h“ Ś¬Ķd†ōˆ(sAkāo”+Hż -%f, ;wfN{f]K%†Ē,}–VɄ’JUćk“lČnÄ|Z«v9Ų™’‰“I°”{Į:æź”6ęŗ(ÕŁ^˜Š­ĄÕį®°1fD!æékŁ3 ’20˜”Y -ū ˜Ź™H½DWZ‹OÉRK`Ć€É£ uÅ+«ŒØ%¦i÷a%[0k‚¤MK¦_N4’+ćä‚U#Ó ł(ŗ{0Y”˜2ĄzKś+1“ž`_wé-!™»A÷kćŗī-YaOeļėŅé>AŠūŌbVŌ|%üzĄŸ_b™šŠ%öŏF0ögXŒKŹVzhžüfr†‹@»?—Ū2Kn»÷Ø)¶ŪūƒŠ$E)ėhąŹv6eƒ(Ł²Żpt”7CE‡¤\Į, %įśš"Iœ:Ų¶­³kŸĶd ¹X£{ ńüS†‘{”¶-ä''EzĒՁy„Ō,ypq×Yžw}ČŌÕ„S õAy ó¾cDļ|\·02ęīęš¢ŸłßZ9– Ó2ƒ3ßrńõ%VÉ)Ļ —Š™Ī—ɲŌ’""B+£­Ńoämh€Wķwä¦rXÉØ%‹˜äAræ%GŽ/Ƅ·ž^š~ -ļś”üb¦5ˆ]½–EŹ”øap ļ\,(˜OšÆĪ™ĮzvæӘu¼Č>ŗÅFCŅ¶žįN3|žJÅ,še³\H#•N|—¼Ø·?D`B=łl<^˜”—ŖÖxd°6ūŠx •LĀÕEõÆM7TŲĖ[£|ų¦°?8õe<—õŠęšĪ)J*eĢ;h€6X»ū"¹ōyJā“PeoŪ\®;×£†..4-‹>ģ]ŗNŻ’ -TąLŅŲ¬1m§WEƒākR3—É”IŁŖ“ ²čŽ™ĪzŒŪåhŽÅy‹U(7üÖ9ļøÅ,Æķ’KB Æńė -i`3]ĒŽ\Į„š„]ŠŲeł j^¶;»:–¶-ƒŌó6 žoŲ#ņEĢÉw 42Ķˆ@.£;G䐊ļœJ+\µ¹Zŗ ®ŃJoė‘ļ yįØōī^ž+äĄ:µįx‰Į -/ Ƃ±īĒ– -¾Œš˜S!æ‡&dŸŠ¦+Æ™`Ž4K AZĆ:dcĄÓŽ¾|°ˆ×ćuĄÓ–„ŽŅ•ŃĆź¬ˆyQv‡×©šYł{–ŻźY­§Mp“FL]Ņ=“JŁ¤źkSż3©Å•ń›®f±}aģÕ}Ŗ=iŒČjMĖDėĖŠ‡Ī¶­S,höó¹žØ’.¹UšS”-‚6ĮV—UĘ2=ųö[~4óB‘?ģĮßėļįšįŒ’{Ķa6:NOą°YćķnÄ’Ū }P¹Ģ©C9źl5vo‰Ń_ -ÅÅO+ĪÓ©/¼T¶ŸEBÖt"Kxšļq@Ū-Éśšµ²ńŅn,.S% ”T­ÅĆU¼®zŲv‰¶`k|-5K.›£!-}–.ģ’>÷Ä]śkgŚgm‚ĶTŗ)Ģė‚óź}ÄwÕżŚŅ[U{Ķg*q\4%Ł™ÆéĒĶ©š¦pš©ģŒcJ}“H›±|zŠćoŚvyBs0üŁŅ£ż=:±ū—­Ė‡ŪŠ®_’nŻŚrŌÄvvš›IŽ†½-å FĻė°iHžB¹“źNx‹eĶČłN,é[v¼[³+'–2PĒaU¢ķWŻĀČ#ČóPKmE™Pu„HŖ 8T=Rrˆań¹Ö…mkvėъŁõJÜŲÕ–ūnš»Œ'“«¼‚ÓŖŁ³a·vĢ+y+½r–`Uj +īrŗߜ|ƒZ~Õŗµ“‘Pų)UČ6ĄŠ‡ņäIóå»3Čx€GLȋ^øäĖ&“§“tT•\X<‚P„M,ó©V3­UeYÆM‰ā„nƑpņØbCF1wS4Ļ„H() p ±ūĪ ¦Ųžļ¶ -"TÄ×±Œ$µ.»ī~¦=“Šƒ—ī4YĄZIē2 ³Ż®”¤d&f”>Ķ-©'ӕˆRž› 0 EńS.ƒĮ —]„±Ē/¶e×jŲst$ XąœyŠB)•ļ}+ÓŚYR£꜋źRŸ$Ńg -õHÜ6ģĶžĶ.?±ķénKéoOź_ @ īse¤~ŁŖ]v@ZŲć,£REQ„’_lkGš »Ļ]ź ų”•v¤ėeoļó[ aX5 ŻŖŪƘ“›Š1„Łż˜QĻ8ēĮń\PÅ“ųA¬‘Æśät­¬OÖ¾=ŖR;.1ĪC ?øćļÆÅ“ M9¹q\al Æö&—n±–<åßOųߣ·­L•]ŚśxŸš.p©xĖuĀąögy2čęę¼—µf}č¼ŸüÜĮÆ%čō#¤Ŗ½²ćĻœķĒ­Č³ģō{ųē¶ø;£ŚąĀGŪ8æWĄ0ōó“āG–žV¾„[w÷r«¦żĶķS’|ŚŖ,m“|,fš†aq×$`[ķ¾ą¶ŻVm¾‰Iį uyaPķGJå§-‹ -×ČsCŃżP”÷”Ź&”`/ ]““Óā©A™s»Y&Q§‚ė¤żO<łóž®Ż‹åaµž“>ö$‹įøŁĄŁ%!#2łõčōqõģjop©©7l±Ģ OyÉų“Ļ“ ÕEÅ6I$Xģkjk]!uüĶ2‘KŠ0m -ČUu°ŒØéĄ:Ė’7ž·ŻnGL+<’*ōœ‰Ž{ōģt~{J;šq„Goż‘ …>^ī€%ؕĻ–ØkĶA( Ōb«Šćq8$źŌ ¦ŅiNE4½ŗŻĘtŒzć9Lę=ųy<ŸĢ‡šėdńĖģć~ßߏ§‹Éķf÷p3›¾›,&³)žŗƒńō7¢ü÷dśn]†¢ųSBč%My”<9-6NiĀ}±>š‡9 9„ņ‘+ W‘RhST2@xlD¦A•iĖ6—%oŃŻÄŹ¦ŌBŹHS¼}“Hń<†čī,ō<½äįåa;„CĶ’ –Ź\iLy'.’?(SŌ£ūYN”NŃ®<­ę E†ló #°ĘżčĖ€_ӛēi5›h§–ĻÄ|Ū]TśåYž%yÖ į‡×0ø“’’}[ՖLŃ7T£ŃŠ‡Sm°Ō¼Į€–æčćsŠāP ½vq'‘dA_³6ėČ|˜F†ż†BķÕK 9S2³›®±ÄÜŅĘ>œ}üš~6~w6t"†)[pĻÓ<Ź6zōķõč_’CŽ#SžŃĖĖxš’8ģõ³ö²Wø ¤”D8f»n§ĪL8•IŃņ¹1õ>Õ1µ;l`FE¾æ¼d­yh é·nEO0Jä B#=ē0sėŸīė[ōŠQsķfO’E'eܧ²āœpyŅ”µØu;ƒ<,Ŗ’C: -®Óų†¤S®^żĖEÄU[ś 6Č «†­@ 2¾AGˆź`WÜöš -øÖ%Õ·lÆąÕ~‹ć|³¤F¼ŗ '©V"ż×KŪ°§=–” %¤ĪķÄ ¾ŽÖØŖLŻI0Å6œŌߊ(¢Ģķˆ"‰°ē‘§GĒČ1ÖźPWÉjfŚeėąŠ±ą³e9v…H¾±éK¾fė§ė²–§#ł‚5;~8ŠŠēž“Įm’[œOÜa2‘ųÓ“-YEŸc…±2nŲ’L Æ4¼Ń`Ɣb»>õę8¼ŗ6„Ƭ=-sR~`~|ó¦¬GU4åKli°ŹcŻ;ąógßµ’žAĻ µ”C£k©Ū•U~@}Sbč9„wq]‡ÜU•åes/yņŹĀ¼É¦w°ĮYWõK†Õs+o>øĀN%˜ļó“p14dB§|SĢL× -ŗ·Šc_a#ž֟X”·öŅ„ēQŌ -g¶Vr«Ė÷Ļ,åN½©Ģōp«'VŻīĶ~÷L {śšTĻ…(ĢNš}WÄ`t!Gh ›‘Lq*6­æ\­ļ ĒG„įĢŗżģMmė™z¦@Źśč€Eż€3ßZbĖ‹"Ŗ2tI‚ƒ‰æĘs8ƝRŠŁX-:'ŹfŌ^|@Ņ„Š½£hōš‘ˆęŠĮł%½P›ƒƒv`9Ó\,ć ž$Ņ Gp+×ĖJ1Ū+ƞŹ×”][]ń‡Šģś±‘9źvT -™”ęĖ ˜šŪŒ‹Äb©¾¹¤Ltįž” -  ­H?›a°ŗ±³v×Ė\…¼=øi|—[ė:čÓ·=ówœ.]ļŹXhf>zAÖśŠś)GžX{U˜Ó„;ŻåófĪVs387§Āę„éÄ”žL‹Ó/µė4'£fl]©‚ƒr›:=¬ÄA«õĖ;©}-‡ˆbČz>łéśä/­YmOćHžĪÆ(!¤$lHF÷vnŃ­ĀŠdv“š[”ŽŻIzqܹv›įæ_Uu·ķÄN£±„ˆķīzƧŖĖļ^Ģżćć8†•Hˆtj…JU:;“ ’‰®tšéD­°y6¢DdYwŠ¦ßT$ÓLĘ`5oø\ˆ’ õÄ.…‘p£ó4V錗ƛą­4 SI»µ¹6Ž«QćÜāƒÄQ15RĪej³ĄPJ&?øŻ^]ĆE„ż±ŹÜ>`©ģ ×Ø –Ś<ĀI‰8VÄZ$ R|0gAh£‘SabŅ2Ņ‹•Qә½L„ÉfjüF¤Źš&“9Ā-źŗŅ¹W„¢µ7Fž@B¤ņæzļ  hÓ”{Ų9ćŻs±‚T[Č3YRłɅEqQ°ł"Q"x·×®ą2žé‰č1y «zR]ĀŅnś˜Y»8ķ÷—ĖeO°Ą=m¦ż b’7“ģ`x}‚B‡=ŸŅDfZė¹2hćń -Ä„ŠÄeMĒ<Ȏā@)–-žN»“; APuSi“ "Ŗ^]€fģ£ĆĖ!ÜįćåšvŲ…Ļ·£_ļ>ąóåżżå`t{=„»{øŗür;ŗ½ąŻ \ž¤’¹üŅ‰&CVņyaH ”T‘Ee\‰§ E‹÷S¶‘šØÕK§¹˜J˜ź'i8%ŅĢUF®ĶPČĆc®,UF[kŗ…,ł€ę~$R>™FZ'¼ćƓ”~_`ōO1ÜÅ“ßēW!^ļ¶]qČ$)Ä2Ž©žAČü+#y X©9FSĄ€Œ³žÓ>#%, ¾-ó=r -õĄkś>Ņ±¼ _ż>kkM…¬;räąR¹lĀ–öʋ»Ü.rŪī@ēĢÓGŖC‰¹ŗŲ yrįe_ZYEčš«™0­æWėøUŁ}Ÿ§^+äGĻŠõ­m8bó€ČÜ/čŠėÆ.wš:Ā0Brüīä"_$ZÄmĢ½Gā—qģ‰ƒšå9åć½ hŁŸˆ„²]—ōJņAD­¶c†HDł'& Q (f"“ķ„¢•“FŖ'ÉÄlZ$ EČW°Ā4ĪņÄrÜĶ³)éxN„:³”±{Š6¢ŒeÜśŽŚĀ”’ÜHæp‚w˜Rlb8Ņ¹EO°×FņŁ¶įš)›Qā³Į(ØŲĢ§,ĆÓCē[xß/"\ŹéfWMqrē|üEņ•×•«aØ_į3ĶX”/xcfś“¤ō`œBü«IÄ  - -Ź0ŗŽƒX„f:‰Y>Ʀ’™_–xB— cÄŖMą˜NĻ/ęźYĘæ Ļ’q»•%äQIéģ`“÷h­–»“ĀĀń7n%ir†Ŗ:ūĶ-ŪX;’ŠĮ—HSē~…M€E½É>;9P'.’ĄmĻD܆P_ ölÕ?ņ\ĪżO/Ī8æ€wŻā™KÅņY§Al‚EF%Ÿ×.g×MµFĢėö%³x›@ųOʶ*Q’øš£«f „֝īžwŠX÷ņ߅Č_%“MŪéi™*Uėåc¬#0ÉSĘhxxˆd·wźÓuB–B£wĄłēkač#Źŗ -Į ēUbg›kĖHžŅņ É·T oŠv)MĒ‘|©¹ō÷*茇bÆuĪ Īšpō(W0sZ«LžFŚÜ¤Ąé ˆ$Æ­%ÜNó$©…Ž½dł(2ÄhĖó5wƒ\éÜśpŻ:ņōĖŒ{³‚bõ•"PŹØ¦)ŗ=ŽGto;…7½˜aźŠdłv}]ź…ĖN׎Ńå µĖĶgµMcōÕcłų„ų…%¶Śf,ō’'Nč­bæB,G£I -ö`ĶN ĘŪœŌŲĻ“šŻˆŹÖ\Ś™ĘMŠ:@ ”D3ģQåZĆĄkķ…œ×`Ģ·Ķ”߬³\GĀojc¤ŻŃØu–Æ hÖÉ(×["eĀ]žČg<`_ģłĀåWo7;ĪĮ}ÉƄB¶ąŠĆ1 Č)Ēr³½\H£,ćżźN#"õșj¾Į6ÅŅü¶Ia‹7‚8ĶIŒ†kĄCŲHgŸ:¾RVv`K’ģĪŽ¹4SYG`ō’¢¤šĖ¼‹…ĮØ’ŽFļ»¤ā*ćnšWrŻHµ–Óė®Ę¶ÖÓ=ģ,ŗpXuęve׌³ÆPсZž°JåÖ»Bu„1ļ&.BšoīśµJŌ«vkŲSźåf­zcš5P/r[SŸ;C8łĘb˜…bŲu¦ś¾’ˆ‡³ŃLÓ©o©†!ˆĪÖÆØ É“Ó¹ L ÄNÄĄM24(:*½8šž\T¼œNŌŚ Īē™Ż¤QŻ_ŁÖkØāÕcōiĆ{ß¼7¼÷¼TŸdōˆ+‰’0+V{Ē„ŚÆS茌ŽSi…ķ9“ÆI(Ä,µ."ćPŪłöµ(t~~īO½Æµ'tķ…’2ĀšØ½y«Šįz©=©ć!Ńg(Du -®õYĖ‰Č[·Ų÷¶:ė¢ī‚ģiqćVpäęļG·ń<®‡kM<Ž#æ.h*åKEsCŠ…7āJčX›Śl/Ā+šZo©|ū¶}¹_S fĖ{ęčrcŹN«“huMØŪ~m²āV­˜® ó)[«½ē¦wdŲh»Ķ꜖ķĪ[ī?lŌ«/ĶńB&õó?-Ū˜ųµ4m[ĪV6‰›˜Ŗ9"V&«žļA!T9£łtÕ¬T…uääT„<åī>Q©äj±TIsż$‹jqĢėSłlyՖIGxĘžNāAµ† YibŅ… -ÄÓƍ`÷ö}Ņ*Žé"7ĻōÜ6Q©²Ŗh7z4£¦Si¤1Ś“”õ)}Lõ2 w”Õ{ųņy”-wŻ(ØÓkõZ]ø~ų4¼¾ų|y?øü{_Ėa5Ļž:įA¤•­Ąššu”¹&‘ upmš“¬ĻRwĀĮśŲ»[ŌļĘŗį«e]46ł—­Ś+lž~—lu#{~Ģ÷śśÆŸ~Ś–Å÷’ )änüå7ŹTY:Š(«°Š©lE¾6Ü q­Qå+ƚüµ!DŚ…bn Ÿ-&Ą}·’HP<Ķēcś; I/3ˆs>łš” %ĘMŒž»BŠ—›¦$ÜŌ…Ł ųžKO•÷ ~°„ÜV“ÆĘĒēķĘŁ?Ö.A–½fńßeŽbN÷Ā./?_üÅXmoŪ6žī_q Ų{ŪĒ4q›f f¬pŠŲmQ C@Ė”MT–4‘Šāżļ»;’’ü–&]Śm›¼·ēž{QN_f‹¬Õ?:jĮ\©XB˜&FØD%s0 ņŸš"MtĖėĢØ4¹)čN,“ī”I½Q”L“œIYā<!¾ÓȔ"—p•ÉL,tĪĒW]Ą2‡4‘$ę°Lsk6WÓĀą±ÕbžK¹”‰Ń=€±”¬~t=^\B„¾’üLi+‡”Ź,šŽŅP¦ł'ˆP•˜Ķ™1ØæX²#$˜Ė¹Čgf˜f«\ĶŅ2‘¹^Ø ķM(”ń•wF[ÅŽ,ĘŗJ J#jFļQ…ükļgčą:p§Ż,½+HR…–µv÷”Ģ ŗ‹Ž-³X‰$di]e}ü蔤SJŅØy „!iś°0&;é÷Ė²ģ vø—ęó¾±’‘/Ńi/ó.‰„ֈÖ߅Źćé -D†^…bŠ¾Ę¢¤ r¢˜čE™#āÉ< iķIŠLS šwCo^@Ųēčą| Ćń¼>Ē|N~æ~7ē77ē£Éšr ×7pq=śm8^šÓœ>’äĆŃoH„ MÉū,§ ŠSEˆŹYƒOŽb‹Ė“ĪdØ"bxɼs óōNę\™Ģ—JSj5:9Cz,•aRiŻŠĶWÉ+„ū©rÕ4IӘ%^Ż9¦ōūŁ?Gŗ‹yæĻG¾Ÿ¶‡xČ*‰b:-ręTæåKlņ"4¶°)ŚPQ -ČD.–Ņ`L9¾fBdÕV„oAb[ćtOĆTšRŹ¤–Ē>Æ/aµkL8¦$"}M;f! Xk”Ź“WxšŁzŽW|ėNąģč.°u·‰©µJ*‘…øĆx0qó„ŅĆ^ŅĮTRżĶ8’3™IL`*i³K -±ćĀ&|GT"µJ“®ŁĮ(ć“då)RÉ ”’?†Ó顆vŚŸąT 6՝öÕ šķŁŖŪB ÓBųאõ*å ”öŹEž‹U‡J.™w74 $µ6ŌF¬ŒUNU,BjMˆŸ'µ–ŪaūĪńĘ3Żū-‹Õ.[Ÿ[Ų½€ÉJÆ#x[į×s_ł“Ww;Åē¾éó;ndHķå°ĘĪģĶŲ»ųjŪ,“įlIĒA}bįą+ÕmŖh,Mč CņA÷EkÓļ‹\ -Cģ‚D–ŽĢ¾¶ÖĀŲŽJ¢j$ŠŲVŹ”ĖSEÆC‹A.3³²P.Tø@iC},ńÉ%-ĪՄĶ3Źz-z0”?Ćęo¤cES,MbWh!ĀKÉ:x-Y,BīŗKT£ÕŒ•Tī³‡=ÜØc lŌŅNg#IĮ¬¶Ŗ¬«> ”-Ś“§m®ŽvŲ¦Ś>Ł@ö4Lgrą?rĮœ1Ź»ØׁCk6šTń66Š„,{Ķż¦j’ķ0āi_ŠÄp£`±ś„5ģæ]Y|œ‹ĶRŚ¼®ÄĶŁ2™­w•pc¬ó‹ż)$īų ĪrfL“oEp<ĆWCG×Ų%¤9p¬!l ›IĶ{…£ĆBYņ@n0Œn -µŽC®¾F?¬ €Š*Ø"P‘Ā}”öEĀJŃZćĶ6TF‹ØŒš½0=Ź”³§TßĮC:ķ,²Ś\`Vi®i#)•–{䝳NŖĹA"łćNķąĆLę[­ŲJœĻCå~EŒyHŲ±&¾T÷Ō%]E5^$.¢ČvQ{¼);Å&ļZļ¾Å׈Š$dó··“šŃŁėÆ«øŹ•³Ŗķśdœq. Ė6>WĶų*ćxp{‹øuŖŽT8xŚn_u->Ølīæj~劻ų…ī™V+Ä\Ģ˜Üz{n™ENUh¼Zz‘Qjų ź’ Č{/ą_CK™f5eŽž²ü‰HC•«œŁ- ‹«Öš÷$įźdēŅyā˜ņž+sć.•ĻZ7/ÜæĀŠ9A»īI6²«ńIgŲÖ½źB}•^!‚Yqądķˆ^.—Üz5ųӋüõb‡:Ē“§Øs";ÕY.=E›•h(ūRżĘ<ņüA*mAų(ÓžÜ ń3pj­łųcĖ­‰šž)mKü+Eō¶zj«bßSEiöš¼Fø˜Ņrå{L3Ŗ÷ć«öq¤· -(ŲDó;N°üŌŁ“Š Ÿ”?e`ž·ś}·ak·Ķ½Üfåū½:.-›¶ŪĶļ__¶¾y =ąZ·²­Ļ–ń“śˆEQé[·tn嚇!Ę|;L¾ķż'˜öõĒ -%Ś;žOČž·c䚳7@ō¼]oĖĒŽ‰+Ī3µ|~*XČšÓÖ>ĮŪćf#–÷ö/E9õÄ'vCö{w_ūķļš~Ōœ§evWnŻq$b-}²Zųļå õ/ÅXėoG’Ī_1µ¢, U?āā„8v‹aĖDQ”ån9¶>néīž1uüæwfĒÓ¶"õ¢$÷˜÷üę±üöv6™Uš''8+‘rˆdf˜ČD–€™pą’F2Ó2å×¹™åęJŖ)3„Lė2ßGńLóŒ“<‹šæ¾›9S®džÅĢ™AµÓæŖ>r2ćÄ-L„rŠ•å_¤N"°Dq>å™Ń €>ēV|ļzŠ½ø„1ZKü±ŠŽ ˜ 3A”a.ÕŒQ‹cAŖY -"[ėń‰O˜ŠÉŃHĪJ$ržq„'b†śäJ’*£ą }]ČÜ»²āµF>£ rł×Ę/PEb:ņ_jg–{ŹI¹ęKéĄ">3h.6„‚e‘åöŽ:ŠĘÆ^ˆQŅ€YW@ŽWɀā¦æcf­fs>Ÿ7˜5ø!UŅ .6?bd{żĖS4:š|ŹR®5FėŸ\(Œńhl†VEl„¶¦lN“‰²@+ę -#ž%uāÖ«iZ-˜ˆ®Æ`Ų˜ĶŃQ§Żž¼ļō»ż:|éžøž4€/ŪŪNoŠ½ģĆõ-\\÷>tŻė>]A§÷•8’ģö>ŌcČP˜)r-QÆą)Ų@hńyŅ3‰±ˆŠ½,ÉYĀ!‘÷\ŁŖ˜q5šR«ŃČį1ʂJė†o”JŽaøļH”Ƨ”©åxwļ‘Ņl2D‚pgI³i?…Bx~ŚöįŠŠ$ˆi™+‹©f%ßØ<ņ…MyŌ†ŠŅ ŗVaV± -rķ@°Ž‚Ÿ?LŠÄ(ĘīYš#=¢ś’ŻķhJ­Ö›H¦R=ā­EN!Qlįīŗįē™»]š4•sw?BīnŹl -ÜC“`žx>ĘSÄ|ĢņŌ@UqĀyäŪeäĢŅ‰µØę=B;ŗ0J¼$n,É@īc@•„·"n«T’«ƒ#4 QŌįĖ¾R÷<ä«6‹”cŗŒ/|0ģŽœÄźWŠŁ>F¢Ŗ3‡„E ¦ØRĢR¾äĮÉp1‘’źWÉ©µ1ÅN¢aÄŃõ–·¦ä’ęų™„éŠŖ§Ø,#™śŽ±¹w›‘ńiAƒ„U>™āŃ½±ĶcRĖ½žłJÆB¾0v+·c¦ Ā7’ŒƒĢˆ{Ÿ; –šO®ķ(‰-Ė,€Ś+fщ›įŗpC_ūćwß i$Łl5Ź²l~ŖNb \"÷ˆtĮtZBz‡;a{„Œ ³»,b·śąŠ/–=š×įyĄÆ Ų0•p³G®“HGGčÉi߈čŽötµĢ»^­Ö sūūå`ˆÓģęÓ ¾› ?ų€4eičĀ>śĖŪŪW ;qš×··—lå±BźķÄ ė$Ą&ž„ ֋ Ž'6yOČ߯3UĀNū|*x\óMū?²&Ž,%AŪ3B%„įŲfōŲŽ·ĻįŲšq}IańVPx!ŌVH=–Žw sÉ>öĀ„ŌņÕĪ*!SńŽ«ZĘē»Ök9śŠ(³hĻć>ŗ%qVqGZDzĘ›–kVÆ›LķŹHßģ€i¬±o+sĖ¹,f?™Ö9×*t«āšm«źr%®Z>po|"gÓF@ŲeqyēYdOĆ!-»—TC,Ś+)öćĘū׆,OÓśŅöi0Ø}ą@żXąē „ėō|8ÄłS ą­{);†ėø#Ūgoe Ž†ŪÖ`ļ‘€¾āįnbł„ߞōÉž»Žķkģ*©d1–īpˆŌUœŲÜL¤=$tBĮdŧ2Kq„D÷¢œ–ś,‡fmŠ“Ņv$“ō,!„øÉU¶×Ą®ķAĘĀÄO4žź é¬0øJ–Ü"Į”Ļ ,±¹)Ł¶#.šĄv²2)]CK|ö[„/ty—Ŗ6õµ¶eæü«¤äŪŁŃ­-_D¶}óˆŲiŃĖ,ńˆŻ”f&JĪC|šo‚iģ -—ö”ŒĮ߈ēRƓĒź^œźēātéR.®1©–t(¤}»ń„Gwš°(ÖnĶUG*ėŸ>č\ W×A=§Œ²ˆ÷vĘ›3ż¦ąP½CßgĀž^%jaW~IŖh#™=wųŖ±æ¬+^]°¶ę3·łvĶŌkĻNæ³ė…%Ŗ7J“īä®*ö„*üśķUv?m¢Ź'ēʙBXēzėPŠ.2¬ -w6-ąQ†Ć6@Ł6ßæoū觥Ńz€žł• ópznµJŠ{yr–‘;XŲ«‰@¶õ!ŠŁ-fėķėµĖĖĘŅ2Ā# Tn$-­9ųŒŠW÷–1#žĀ®ŚÜŽÕÅŪņģ–XZqž¾=ÆüåXmoŪ6žī_q ÄkŲĒ“Iė„5f¬p†Ų]QE@K”ĢE5’Šāułļ»£HEµ-ĒīśmAĒÖ½ßó~õ:_䝱ō“§0)‡Pf†‰Ld ˜žwx%3-S~]˜¼0#©–ĢhS¦õµHń½y¦yFZ„aĪB|™ŹŲ”LqÉ"‹˜2ƒīp:ź¾å -dĘI[*XJUyVb^ü ­,KēKž=˜rnĶO®gć«wcø¤ ]éa„0 ”J©ī FS,Š¹f)ˆ,¶įć;RTd)׫õW!Öx¾–cT!›c¬)+©ƒ¶QE©°āYŅ'mķAŠlÓSŃ|ˆ˜zSĖĘlŽ†SOą—įt<ķĆĒńģ×ė3ų8¼¹NfćwSø¾«ėÉŪńl|=Įw#N>‘ęoćÉŪ>p,ŗā¹¢$0RAåQO>B‹ė“Īy(bbzYR°„C"ļ¹²“Č¹Z -M­Õd„šX -cA„Iu#7Ļ’7Xī;2å5“2µoīR‚€!ś„;K‚Ą>ņDŲæm»phMÄ“,”ÅTŠńģæ"FSµ!6R”LSZŽRmyˆ/$ĖkžĻ¹ö³Jė<’5ń+ꐯµ ’Ē>” .*:RˆėćŹČÜz×ÜŲZl=ś@^…2ā—ōWĄ„—’ąžKūöģŅłĮųE¦ bn™zäĘ«Ād[t{/=oŠĶ[³"5>›3Ŗ(¦qó“ą c>}vU*g—^ō„dO^¶Y,¹[hR¦Ń3&µY!c/€)ÅV]“Œ*'`#nŌĢ™>B¢H…%1GĄqlwRK7"Gį:šŃ6«sdD¢čthT?{ÖÅƱ3ŽĒ ŌŻpSØLW§I”’§ęÜ3œlė`{’UūāÓāÕĪĻ”nļq“BŹ:l©ŹNąÕV×@ē,śĒkÅiO}ŻÓqRå^ēģ6äŒ?ąU¢8¼¤xž’Ģqī,Bew{ģ³½Óߣł;¾śž¬QmWŅ“>fÉĪü¬…ķéŃ£²Ć•d{kc”ōSoORńRdŃ·7ŗ=uZ»hķՂ‡wxĘŪ››Km/\“Ti#Ņ”ˆ.¢ļ(…ÕŪU‰gńģ,lO»ŪNjxqq1e|?„gÅrN7Ś˜.•xįtQŠė­qæÄėUGż¹+ó{)¢Żć¬²Š2ĢģĆŠĪ"`öĢŖQ¾=7æHŠ…ÆRĄ:Dxm MŗĀ›Ņ§µoPFp]/nķ€q ģŪ]"‰rtCęXÖ>»«‡v#±×D Śīšn&n%ØĪŻėoŌ/gŠ-ŻØš‹Ó„-ł~$³ß ģ·Ę$–RO`½ȟ.¼Ą›ä&÷>7ō¾ {µŅ“:żģŅŚw=x\Ē£młˆ~žæAH%Šc“Ū@ ¹Abp0…ooõ†ś;½>³.Æ”ƒT|?a½”æW-X…§kŌę0j+Ų_ī[(×ĪÕFhzĆLöŪŸ¦¤=98öRŅ—7„ ļfh?G9Ļ„¤s®÷a] vü÷ś²ó/ķ=ksŪ8’ßó+—km%²ģdī®®ģČYŏ‰ė2vŹV&»•K¹( ’ø¦H IEqfóßÆ»ń&@Jņ$3;[ĒŚČ"Šč7ōāå|:“’äÉ#ö„Ē gĆ,-£8Ó +§œń/Ɠ,-²„÷£¾N¢¢č@kģš&ņ“ą#VfŌø7†šĻM6.—QĪŁy¶HGQg)ŪķŻœ·üÉs–„{g9›e¹1‹¾HDMrĪg<-‹c7œųĖ«žÅÉšŲ¢ °ŒĖ)“‰ ¶Ģņ;6PŃhćŠQĀā¾˜"Ų1ē“(!…Ćl~ŸĒ“iɲeŹóbĻa¼>’rs®)`5,ŠzŸ-$)Ւmö3B’ŸwŲ.4ĄN[ņķVėˆzĻ¢{–f%[Ü@güóĻK@›Ķ“8J‡Ō[R§Ē’.d”‹ˆ–ķf,*±7žŸ±iYĪ÷÷—Ėe'"„;Y>ŁW$īæĪ^ŽœķŅŖĻ»4įEÜśeēĄćĮ=‹ę€Õ!‰–(A)`±Ģć餍½ „¶˜ ÓŠ@ŗŻŲ‘Œ¶z7ģāf‹½źŻ\Ü“Łū‹žė«w}ö¾w}Ż»ģ_œŻ°«kvruyzŃæøŗ„æĪYļņļŲó..OŪŒĖ`(žyž#€iŒå#KŸØ-RNŜćq<ņŅÉ"šp6É>ńœĢaĪóY\ h @rź1‹KRŖ»z“)+ł+°ūA)CŹ²„züõ“Ō”żż“źMö÷é•2„õÅÖ¤‡U¬Č9éŌž#eõ'9J2w”k¢p6Ļć“4–=Øw˜¤é Pæ÷œC6ų–l„"õ#*X~8ųČ&ń' O ¦H ‚ ;/§ńpŠś)\†OŚū$”ŽU9p-æJ.tČD‘røø ęyšTĘ5?‡–É}üJ€w&ƒńŽ±šZ‚Œ,z"Ņ$@UHņ$!¾@‹\ѕÄwÜ ‚œ‘‚*4ūK°7ZµĒ$-H¤E pÓ9˜#Œ^fŅ#u!°qévI'ÅĀĮäa%X Ź„ÓźÆp„)²s9å©#ź)Ÿ)3—“”ĄH“PCAź"€‰öBmJ¾ć^½LłRØ&扚£Ī€&‰ų(Ū¢ŗcsÄ_rRšMšŃ‹a6āĒųiŸ]¤ą=£$žĀm“cŁ¢œ/J6śžÓ šė`£WŌl·u$”ņqœr9¾ą&ŪšņhzĖ·ÅčbļX½Ū;f °ŖĖvĄėļ56-Ź{@±+ų±ĖvY2ŚaĶH‹Yh|ųŚz,xpljV6…½{PCĖįO„ĄÄšÄx##¤i»4\›ż×A’1œ@¢ąŌŒJ”jZJ 5ĆP$źµä{¶žƒ ‡Čh6Cž‹Äó#ü÷ūOü÷éSÖĀ÷æŠ3²3š–x;Ž¢‘æŖį·!>‹ 'ŸµŁó6ū”Ķž#H‘ĶøĄ’ŗ9*ŻéH\9LCˆ/5#Śž0«ØVŃŌRO4LboĮ!*w -& Ńn-– ˆźl•ō*ĻÅą.Ķ0ō ĄŽ Ćaå8sKõDf£S:Žˆ9BŻ;ĪE{«jźGfLØXąa’3®Ūüˆ~ ĻX‡ļ¹ö…8¼4ƒˆ{ĒĀAõB{±ÆżŠ@„Gö&ģ«9E/ ósʘēD¬Ä“ [H' -ī[/,š2°ķe<*§.¤÷ų•3½źŲØąÜsbM2bš®„E7ōÉ PŠ — p©œ/JžG°śh³ZAęŒG Ŗئ$įó„õ`8\Dˆ e™GsVņĻ%JmcŌ0O³“£:U$4 Ć©Õ>ż‹ædļÆ{oo{ļśW ļgGŖHœf“nŠ£w€ęÓŌj€‹Š·‘ŻĘŅ?%Q>į8éaMOæv‰Ń󔘐įy\ÜŻ?žmø_^]ž‘§ņpļ#·šĆÅwįÜ ,`ōŽč…'Ā$ž¤BjŅwų8‚xTĘO¹Ć {o.~¼¼==;ļ½{Óš{ĻŽšA 󖾊V˜Z°oĪĪg€zÓæ¾}Ū;½½¾ųńu“>n€Oąlų8ą&ą‡÷ęõĄ¤vm šźŖ’: ~EĪB×ćhpńøō(`MŠ@+ø^ąų6ŽBL"I‚>ØJ1ƒĻ€KHHļ/NūÆoĻ/žvv*lgƒńcZ˜DŸćŁb&&–6bąŽŽ6ž‹M8ų…M-2?õž6é[qĮ˜±)MŚDĪ²¶…OQ.§h\+§“īń,†%RĖŗ— ÄĄĮm),‡ŖĖUK7ĄfA+WxßK‡‡ÓŃk®†(–‘„© oåfø(׳'>r£ %p`‰æ«å ŽąL.Š8ĮŃ -uopĮ Oa*ŵY!ž!ę3ä­Xųw‚h„nØĀÆ`ĀŠg»Šļœr–jŚt3ņhęK… %Ą®œõIøŒq•Qb&oę?W0ėbŲ²ōfr¶;œFyŃźTĄ‰’r×UpŽßČćėĘå”ŚæŠ -ž3ŚģåĻPµ®0$)Ē#eę®Īƒ$²ń"Śx{K–›/†ån#GŪ’MmCŠŸ[¬%4Aųlc““wLøźfGÕ׎Ń`ŲšY&TiktĘ[ĆuĆ1Ŗoo°Z"ģwĢĀ\Ž®” -bæS īšĄ±„{‚­ś°#ī|$źÄfąÆśO0+ˆxÄÅ­\•hŒZ1°Ō“4ŲŠėš©“4Pö•p—mIČ[FUŚl‹ˆŚņGūźy\C xŁW›…k3^N³‘š0M¦ ¶˜Nø±WĀn‚Pė?‚Ėš1Ōg“ČäZć0øĖ¬¤-ĶÕ\="æZ+āU\ņ»ĖŅ=ž9.hŻ$Ęsr§y8—ż±b1 -üĆ0Zø•ń‚ŻbČŗĮVŽB£Å`£šDÓKäÓ,ŽIX -§ -!,Œfß|óÕ¹Į)5Ų{€ķĻ8,0jL‰9¶“¹yFk8™okŌ¶DƄ¬eń×¼\ärÉ=\ä¹±cżvÅFŁ6”Ö,Ņ£71JNźŽÆ;¬}£}­Š¢É‘šDu“+D¤§ŚŖžĒn xƒĖ>ø栌DCŪb’ -bLLÜbŹIęq”‚Gi&źdķ4Dl>½/pżO½•gåŃ2UŁuĢA,(`ŒóÉ “Ų5*ŹÅxL[÷2ń,³Ė„šE-m (*Q,žāĆiF¹ ųņÓ-ÖÖé †Ģ±Ö”īæļŠ{ƒØPł ĄĆ»‡‡NŠé+e¼šf)jĮµ^Ze_d‡üŽ^Ö*•ÆQ„&<ÅXœ›ōWP™dēĶŽ"ׄ½įž+/’+;_5ä~ŹāQ#ėŖ~ŲäŪ×ooĻ®Ž“khcµŌ…ME®Vź0oW„Äe&BŹ:)|;Üåz_,Ķ³ńżį°>AģR*…²wøįł8’)VrŸēŁŒ6)Y–Ņ&“Ņ"„q*w©L8Ŗ–Ś'ĘŌF”Ų²Æ8ĖMŁEMx£ŃŖ HzŲf`r˜°‹¦ŖBMyz - pzu²Œī )œAEÄMÉ4 “ą ćŖSŚ‚µ÷tcTgĮ—ø„w8 ĖÉx¾•VH:įz’CmšG^Ö ś¾ĖL›n½‹$;| sŲ"uķ¾>Tm6µäļcŹX£ƒט“Ā­Į¢W%ÜęĮ¤Ąu¶Ümņ(!Hu3›Śü—7ī5LĒ}\C›Ē­ƒHŚe™US>Õžp_¤ Ļ­ųź»ąĘeĪžSŒßI, ćļē¼”Lh«æ±¬¾mķ£3śŻUÆėŌČ÷zYm»Gį–ėĆ_Ėvµ[©5WķĻlĒÕ ś_(ųØń6ŗ…œÅ»“ų7r®ƒXhŚ„ŠBhō‡Śy“É‘žT±®Ģå=d^\¤+ćc3Vó²Ų>ĄŅī±©_’{{ė,ßt1FH_±…ŠV~–›T„ī”edØĀ:6…~³(½WŁ84²~Õ&.Ķ—!*D×f员T³;~Æó°·ųG%3<–H(‡G[ģté%ˆ–ęĖ§ģ…oė¤ģÄ`"6A‘“u„¢ŹbVśķ ¬¢&ÉļĮ=¹(0ĘJjt'Tó©³r»Tżéd»dYĖźė£t;mYGmģD§ŗ‡z’\3ļA^Š—’žb@“éoDhXŠæŽūųjsĪ§XĘB•Ā¢0”ja ŲH™µ²„kł'”DUT “ -™V3 Ń©¦ÜĶ1…%ƒżźDCļ֓Ķ”ÅxrĄŖ0G ©ü@\ž¹åPē—Ŗ4[˜4ó?ēĖ|0³¾©cŠ;•Ež…ČĖü?óęO6›ŲćnWŲUŽŖbY f$9V—¼’åF8ń³Ėh¦wœTĮ­E ?@Aeµ­JƬŲ¹Wč­³uOŪ Ö¾¹©‹ą108Āņ$ŲČńŪŪ —įz° …åę­ŪŹRźĶÅĆĄ;Qżā¾±äźoUāxœö²jŌ2©Ž…¢t/ņÆe“"p„įi;žĶ4H“ -„KU‘åŃ ¶`Æo C‘».¬Ø¬*śäN<|™čŽ9z‹Gk€G9–ŃlØŗ…R]‘"ł -ŒīY«z¢åųÕū&ؔյ©!ĶĻżČįœ%Ŗz¾z߬Ŗ܀!|0Ā>6°hQi‚|zK¦ļĀZœWÖę›NĪEŃĢÖ"ś÷t>^ż[c+T¬õmē/³C®+€æ)R·Cŗž‰Ŗ4Éļ=æˆ7Ć, Y“¤½ĢUvŠž|ŻTü(wŪCu Ķ¹;»jC֖·Čó‡J4dÕ²U£įlņWŗ ōŠ“?]SPžČ/ · -VÉóźcõaĢ²ZV°ļĖp~FKĀšœĒzĖ«Fvśpf·Z„šŠ -tv}{U$“½WnĪ ŃāN›ś£rHģķH«Ż©ų!'Ķ¦?īļ³kœÓD”Ö¹Ąƒ#&†¶śĢYĮ [`0<Śī#»ćtģ°pŽ[GśTņ3ˆ_%ul[BoŃŁæAŽ-Y÷˜>žŠRĄå€ļ…ėå„Ūs5Z»ŠIÕ»¾x;Ćść•{Ž/”C1Ū†¢żĖ_B/*b~ܵäür‡U“Ż÷. ²€M9,-Įį¬Ļ¬Zęŗ:|6›ƒė–÷ -¤xOÄ0É褻 ņ!Ę ‚ng’fć·I¶¬5hŸz­€0å“Żä•³łž +Ėl¦K1ĘÄkwS„#„č¢e™TO•1Š£rā4F5„W“®<5j=Rxi4ćŽĢ+{”ēüØT­˜Bj#š¦yŽleēČöeŹÉhrŃ ń”Ʊ>ŖP'\ ³Ó­Ń£×YĮ“E–&½lŒCńqŽ“ĄwW¶z:ȤŪœĻyTś“‡Ń¼¦Ql-÷g CŠ’”ÕƒĻsh<ĢŅO·€XĀÓŻ•$&ońžœt:’®¾÷ßu¤āÓ0si<æ» ŽVH…ŗõERR a)įŹČ)Ā¤ !ŗĘ·nļJ鼈P„įˆ•dD©nÆ؋Żøk[¤ŹNģ³įvē&ßp%ĆEB7a õ‰`Œ³Ö©ĘĄå³«1M~ĀĻŸÕy1mż9Góü|y*.%Ø8&ˆxG|4 <仆g;¢Ó®z*AøœĻ@=éģ.įŠ–#Tęŗm}æŚWø×ęĪ•«Ŗ ģIvW²Ē…ą‚“—7Øȅ8üž‘įØóĶ”ĆP‡×nȌ}Ķj·fl½½”Ķ–z÷³÷•^nź×!ŽÅ£Ļ0Š¼÷ĀRsÉ}p° ·õ…굟]=’Ž¬ųź›^X6“8«„»ž~·±Ī=Ÿ*Ė'2wņ¤^`ļŪ½’;į‘ćtŹóX¤ ē8„Å|å#Ś—5ĮS .;ĮB‚Bl“õ¶ õ cšb’l™Z0v#Ś'c±坤pnhu0!™f(F“_L'©c‘GYi×l”īlR—˜fń8_s"ŠÓ]óĮéŗ†$ĆSņ~iż`›‹‘£ x…—> #÷yŁ{Č=ÉFQųDĒp#dh ÷ž“VĢ; īšģźoSG4ż [‚R kÅH„Y’®{ć49”c­?„ē ^Ś¼·‡l•ĮJ­é=t|‰ĆŚc֍J·bąyÄŚŠĶõ rZ֎A_ō›<„ Õvśŗ~BB’NBĮ"g”W›+ü‚aūČó²ķŸĒČČ²§0·—©«ģ<zėłŲĻŽ4›s`v6ö¬”Ձ3 ƒ“µĢJM«±J›ˆŁł›[ˆ ;l²ļĮęQ£ī›j8[SĒ恊†Bū°~§zezh^QĢµT镗v¬/!‰*Łb!&ū˜-¹Hkń,ļńѵņt…&ę²õEøö=P(…”YĪŹŌ·vætńžH2‹š®S}Uŗ{Ō»«kŽWæź [U±3Čvįe XŒB×æĢķu¼ŗ‹QŽd-ßsX‚„YŗĮ¢ŽYÉWN#†÷nŽZé‹BÆĄGjc»¦ņ„Ŗ¶vŠæŗnÜqRw» ŽjYŖ©<[L¦īÅw9Ž­'ŸŚ ­ųM -°ö:¹vÖ¼ś*@wĮxŁ|bńØ Ęž‡Ŗīh¾%ll ©”ØĀ»™'J…}ż!ž€ė›E)Ž\HÜ-D)žOĆT2ƒ¶x·%}••_åŗEŃ¹¦ž²łåóLā~šIoj#Œ&łŅk-ŖĶŻ£ĖŹ!²c[Ž&%±ī&¼ŁŒ]µœ}7į…s–aŠųŠ~¬xź«÷ü=ZūŁ.ƒŖŒ;ąC2\Ł*VX‚cF’åšŁO.Į=ä†.>:ū±J“‰ś„žļ2#;¤»š©ē¼¦TģxĮŸ>żØō£+€7cčWUŲO„¢ś4žä]…ÜĆ(KcX @jŽ‚I e!ĶD>œ ¼~±žŽŚŚ‘5Õ¤=u_tž7ĪÕ,ź ėÓęxŗĆŁŪ–ź“ƒ«ƒj}ŁŒĢžĖ{,UxP®ż#ü“¹]%Q™k«W÷¬ōrÖ¬K…ÆqC‹SW¬`8b±‹Q54:čćĪŸ^yM–čsLŒģ£m›EŸwł_x6V‘uŪjŽĀ[ĪJ·ŪpnĖ‰“žŽķit™ŃVå/Ī„éŅ±INÕé)=‰žĪŽĆxd1(óhXŖė1Y0©_F7ö‰Ø}’dƒHŽėg°ßVŠwÜ6ųģ±ĄĘV0ž’!mIJŌšx€©Rą‹õIĶVē÷Ūā|źJĶkÓŖ~”>c=ó3#AšZĄ%n “ ąč’Õ5ø؟døļĄŪ’‘£cK—°XS"Ź1æ³ė -n?lųåOŃgÕ³¾āŹ±k:,ėb¼E˜Q! |×4gŒ†•" ×Ōģe5“«ÄžŚŠ€v[†üox:!ü‰ĄŒ¢£lsƒ ŽbīoI čÆkĒ%ÕćÄżTķŌ鶮+ŗošZ„ŽėØZŹń’ųho/zļp‘¼Æ’®]„Ÿnœp¾Ŗ/"²Ń©UTż/''“.óĮŗ>ē -ĘAXĶŠīøŽ5 ŠĆŚ§faŖMĒÖĖ™ś²”ĘN/²ŌeÜęȵÜdAhw -ļ\pšŁXŚSqaג³)“Ć¼*œ:ņ$Ö>øpWqbāÓæčJĀŒ;yźp­µÖņ=—Č·A!īøM0ŠHĘ)Ēzį(æjž«vG_qmüžśģŁiŖō‚Ķśå±LRQźQÜ žEŒé$n ŃDŁ‰ZN7“tc8Ļ—ųs ™2tĖņ§b`BDfÓåÅ%Ÿ×c§ģĒēh7vĶfMģEVŃĒ{Pŗ”ķEūĀö•¬'Xõ|_“ߍ5…ęńRÅ[És7lGēqJ‰ģ"Āßś"/Éžb?Tz˜§įKŚcńż,‰Kp¢‰‹t„э#Méó·³æœĢõĖ¹Ą =ūČöŗ÷=æ†3Č:gĘÅ5+Ūō bG’°ą¶»»¤z«KѶaJ;'…<§BælAēĢå=ī8É ßZ(ĢV!#~/iÓč˜øĒ›,$NVMnŻq\óNī\U“”Ė «i ·ž©Æńuź¹ķ«Ķ­jP‹iėå&*€šŠ éDƝæz€RķśõŃ×G/żµXmSŪ8žž_±Ē0%0)éŻGh()%męøŠ!i;›FqĒ‡cå$™kóßow%Åq^xkĻŪzVūņģ³‚×o&£I„~pPh%©„HeV$Y’Å`GäæљŹŒJeOōSy&Ó¢Tsˆ]$‘ĢŒ€U hND„]5“S”%“Tž „MTÕf·µx+5ØLZi+ķvÕI?·ų uAÄZŹ±Ģ¬9čJÉę;—½öŁ9 ŃUĀćpčĄ4±#\“˜*}C4%ƒ„¶)$>³#Ō2z@QFj2ÓI<² ¦™Ōf”Lpæ…ŅmgŒ3¶ÅXg*÷”,Eķ“QƒĻhˆBžķšTqvüŪżcFÅ 2e!7²°ņ.’‹ī¢cćIšˆ,b“n±śųÕQ}ŖŌpyKhśY;9ŖקÓé”`‡•Žė!Äśf¶Ó=‰NĢ§,•Ę`¶žÉ9īĻ@LŠ«ˆČ©˜R¹PLōbŖ1ćY\#“ $X.S‘“ą"†¾¼Ó&øF;Ķ.“»;š¶Łmwkš„Żūpł©_šWWĶNÆ}Ž…Ė+8»ģ¼k÷Ś—¼kA³ó•æ·;ļj 1eø•¼›h -=M(£r°Ä§ą±Å×ÉLd” “ĆĖā\Äbu+5·ÄDźqbØ“ =ʉeR‚®ÅŗäÓ}C¦B3)•2āōÖ3„^Čžé.āz_…Fx|Łīć!›$Š•kęT½:’JRŠhonT¤Ė%Ž°į)hāćžß2²Ž`X3–¤†‡š2šü #A/"©™£Ōēø–ŁAŌ%2įOp½é4„č ¬ØH“8ćlŅ=‘‹~g«”{£*!Į½Ā#ƒ"Ā ė֚P[ų†ĶnV%m^Ö³S#×TļJMCCœN“BŲa‘»>$×aįźÉ;K¤ž¤b†”^rżp³—€²‘–K -7\!°…U‹›¬˜K2 »œ·²©&="- ņ@X\m’,\ų#7ś’äW–m¬$åčØyŃ~ß¹¦š+X¦±«Ź˜Ķ)Š‹óVo^{ -āŖżžCoNå - -ū£w~5F3r'Ö+ŽXfaå[…¶ē6¢ė€lÓIŒT:ąōś%Ņųuałé­@ÕZĢŖŽ -“qr'ū~A?n±õ°ę»…„揌ŽZ -‹’™œ.yūQ«˜°/ō—¹¼Ž<  I‰,(ŖÉū({ ŽsÜ„v¤U»QÅĢŠyDSæŒdĢPŠ0|‘’‰Šb¼Ś_œŲ%ū^Śńj į›¦§«pN¼oŸM\)·³·”„Ķu·*”k—÷QŖa˜g‹ėõõ"-Õ"ŗģķÕžćŻ@EžZzčjlc÷»óVóÓEe!éŚ%)}yr}yÆĀžß‰ †M÷·-v~,y“}){WøéĪ×Čł1h’n"Š¤y°ö7r1–”AēÖ²īJ÷Y¤łŚZb^–•Z@‰©Sīź·ĀČą^GY>²žó9ŒO‹n}øŚ^@IŠ„įSQ!æ†OtC2PųˆiĮ‰ō)bJ&¼ZĒdU“ĢŁö¹/ŗēO‚üūUFŅå“XTu¾ųóįŽŌ‡,9 -åO«y©[ońlĻ§õ[.~˜õ«Ø-UgĘÜWjĮ֜m'{¤ĀaGy_uÆ -Onx–=n>ćĒŚQn„>ä5f¾šĶGQŪj×\¹V N×āĘ 2G#(õĀśņkWHŚQé]¾g®©Ŗ~_h40)b÷× ß֞ŠµÖ eĘ,ĒUƒ·ŻĪ²Z†k¾ö¤Bxs¼!,/¾Ļˆźūwj£Tf‹wÆį×’5Öąn1žizÆ~4n7I¶„ĶńüŅŲ:©`CX/^<u}ōL0·Ó3±arÆ”rÅ|Éöīw£v_j·¾tÉŪśšÓ³÷lbųSŠ:'ž;¤Ź;o§ ĪXpC4Œ9Ų:ēxJ’ģ³M’<žĪł%„“ Žć~5Pt*Ÿ&ōo ’'ž<ĀŃbÓŁćĒÕųI»æė}ōxP–äÄ -ę+åsÉYœUšėĶIå?ķZės9’īæ¢×åZ GĄŁIģ„Mģ„ŗN²[[©”K tfXIcĢķśßn=ęÅ —÷’lŻT€Ō­~üś!i^¾ZĪ—Ż'Oą œ‹CGš‰HD3ŠsüæĮ›8RqČGlņĖxAȔź Ń|Ÿ€ŽĶüŽ’ųß0žź“Īć$š0-āš½įy š+—GœØc ‹XŚE„'-G`3Éł‚GZu†œöƒ‹Q’ĶLQR¢ŸeéP€•Šsœ#¬by SdÅ&AK³D„?,Œ D(łŒÉ )ÄĖµ³¹†xq©ęb‰ėH•į¹FYĘ~YŌu'N•œÖĪmų‘Ź?uŽ”‰ˆčŠ¶^ź[CkHĻøæ ųR£ø(Ųb -†Śi—®2žę˜Äcr0£ -ÄÓü4`šØé/Ą\ėåónwµZu˜øĖY׫Ųż€– Ļž¢ŠžęSr„ŠZæ'B¢Ēk`K”* ,@ČVäAć(”b%ŃāѬMŌŹƒ ļ¦Ģh^DT=?Ķʌ{CčįēŽ°?lĆÆżŃū‹O#ųµwyŁŒśgCøø„7ƒ·żQ’b€ßĪ”7ų(’Ż¼mG“įRüv)I ”TEł$‡'/”ÅłI-y ¦"@õ¢YĀffń —&"–\.„"×*r‚šXm@„ˆtC7%ÆŃÜ×ÄŹĒR‡†āõCJ·Ėż3„;›u»fČĀīnŪ†Cƒ ¦āDLu|ąµL §$'c”¤-mü,1čѵ„T@ŗaœ ÷LBČHŃ4žÄsˆĒ’įīČ t‰ %w)c4¬f½D>AÄ:\·q,T±#33†fŗgR$a -„ee—†#“#¦)ŠQ·pÜ铼‡^ń„ŸŅ§nŽHĪ4‡ˆÆ2 ŠŠ-rb~ßĢ‹ĶÖ 6ČbČ5Lų”%”›yrŗ5”•ßó|zź¦œ@cĪŁ$oä¹]D†t®!°²y` -cĻēóń—§§”KŃ ÄkĄŽĻ½<ž„<žy¼Į Ėyģņšcl`rŵ -bĢp*ŠĀB1‹IÉXĻŸ÷>ōß ®·£³Ė¼ž}Ķ„•LĘÉl^¶—šŠ#Ź”iŻ~=2K·hš›én˜¼š$‹eӏšeī2ČAÄŽ;ÉŹź ø¶åé,ĪDäEÉ\¶Ÿr/»`„°QXóøņģ•ĻDšĘt]ę~W¬¾ÆSy)¢ŽĘ±ÄtnąämaÆ°ƒšÉćYŻ¶t.Q8”ŦÉ"“ ©.½Lō]µ0Ó -1Ī7–7žqˆ3X›/˜¼ve½ČĮ)pč>&£Ó󄖧ʀ*R ó8œ”’­›ē§æʐ±ł±iżwrjĢ×rŗę$טOÉŖ§åµGłķ°Ż?Z±dIyŹ:µ [Ę'Ž²µ¹ŗĖ߬”©?ŹxF­Ą˜ÉĖ¼8vŗŚu~¦#bnĮõ«5¾PYrĮOE©žlŗ/IfžöXw£ŪŒ¦Ńė -=ÅäL5[p -ĒŠJ§dŖѓÕ/C5ćŚSQ)89Ō%g9›LŅ•hŚÉ­I{ōL…7 UāVĶ‘›ųhBć£GC£ƒā¶ĶśmhT,Ū0e·ōÜmüāaż™ŒO‹„‘żt·ó—Ų(mūfā†GˆÓ)v(øĄż…źT.~Bt§ĶY.”¢IQĒ) 8EöŌlø4¶›Ė··,­›®Ż“ż§(ö›‘h‹‚#'*%N÷‘ -Ņœ×)ŁkitÄZ‡0’ ĒLĮmgRP“ 1ķ|V‚66Ų8óGH-œKŒbS°ūoÉv“3ä -³ņöp·ā隩®åĄ·€ź - ’›ž™~y¹%°īG®eŅh{vˆZ²żé  š”ĶY÷|œDŹÕńųā ė!iĪQlĻöńy€f„č«AśŲĮ£ĶÜjžAŻńåčeįŠ­•³•ŃĢ£ »hZš¦(Z;p%—ZŠęĮķLŚ$s¶Ē&1·%Ē@ū±"Ø"W•»”Æ!ļø¾?ń}‹É’, ÷fķ¶a7‚{«SU_={@_m-<Ģeˆ¶7[u:iśį=Č}£×,Šš‚ģŠ*օń#ä¼o:iÕåkøŗ¤ń)R’ “QĢIŖ›E)nž¶ūWnp'¾«žÖˆōĄ*™D÷7ÅŁjŪŪćģŌ¤|ąŗĖ®-=«Ā,MHĒÅSĻėćūt¦lrD+ó¢ļaŽt :Ķq§-ītę,ŻE–QH†Ti‘Ln“¤„—£k¾NĻ¹®čKŃŚy#;)|Ś3”öāz˜G“ģĒĮ3ü÷9ļ²o )1„„kP˜]Ģł­½‹Wü1em"ń§XžWīĄŠŁ{¼¦ž¹˜;†:€ŅŠkž»ĖįYŒ3<wĀŅŚÜ-Ō·’¶«Ų®lļ,ц÷¼GÜp„ē¶Ūżåmłt…Ģh/=«=€ōuÖ§”X>ā·ŚVŗåµ¢(RĶhNTüž÷ĀśūóDŁöš¤**ÜiZfō„I–Ŗ=Ctu®1c;śfč<`.×0Rå<䏄ž®żP——Ź*ē/鶌_ņ•ĄŌ_ćŗ®ß;1‰B ZyPsäóćēoL²gY€NNl`Õłį£æŪDm&®!Æ;ó÷°”`é]ļ?ŗŃJŪD`śŹņ\Šų(É]M§ķÅÄŚ¼śuß>Ų^Į+óvQŗ”Ū O‰A&#nōх[M~E×)¶Ó©ī¾‹­nīź‡H¶5»ÅӜ2aUk½Ń®×šĘ |ÆĖéå*žh>·óŻ9‚ÕžŃ¤ū¬JŖ‡ļƲ=œJĘ ”©“ūUģ«Īė¾õ7o˜d-{ź–Ź+G?÷įģ|t׎Ę¾©±/Õe’Żū½—rׇwekīmå”mOR6NOśE­„¶/Éd±°9ŻœųūkŅēC…‹×āz\L]YŠ5\pā“mmq,äQ:ö’vŒx™Y£ ‡Vˆ6ąj3=§½Ļįn÷cL„×/*“·×Į5j}(]o"TØõć÷’ZD>Ų󁓟›Ō‹ĒŹē€%)ŚŪ,[;hmW;l¬³ć½t.Ü[›xh¶/®\W—ģ ÆP[ Ly{ģ¦ »nŖŲąwsŹTwŻ¼[^ó5¹Ŗh’żil{¤;hé_ļ‚£Čõp™‹±“ćŸW§ĶXmOGž’Š)¢ƒ±I¤ŖUˆÓŠj6"UBėóŚ>q¾»īīaܔ’Ž™}¹÷3iE£^U™»Ż™yꙗŻÉėŸćEÜźķķµ`Nż€ƒ…Šł”ĪA-8š?½÷Q(£€”Ąć( -Ą ˜”]!©sßć”äSP‘–8Ž™‡?£h¦VLp8’pŹ”…°{<:m¾rQČI:°Œ„1+üI¢šC`4› Ī— Ęg×cųt|uu<NFpqļ/†ćĮÅßNįxų™$?†:Ą‘24ÅļcAN RŸåÓ\>9 ”-6N2ęž?ó=t/œ'lĪaŻq”k"ębéK -­DSL„ÆtRI­ųęŖä-Ņ}KŖl5Qi‰·w6Sz=†Ł?Ētgó^O/¹Bųś°mŹC­’RLF‰Š9Õs•ojX.ī¬ÜAĄzÕ„Æ”ƒ–I üƒÉZa&‡^¤+L²;C¬1³äjMµ ų‡ÜXb˜ēQ@cįß1e<1 ėŚUėK S“«ōģĮ;?db°fœZÅt%X¼ŪĘ$ęéŽÓµ[Ä˜ŹÓą¦le n¢¾œ’”²Ė³K§h–„žī…™Ż. ,1<ÄĻ<¬µŌ„/Ų*° ³ŻĄ"qŚjL>öĪ»›Lµ4­āz|zšS -®«ZĢC/UÄéq’NW“Ó¦rNb½cĻTEņ“2¼u‰‡G7äŖēą9M܇. #Å_ĮÆģ–ƒL°`›ˆBōqAõ“C‰Xč āōQāK§Ī`r1÷ūVCsYµæå%umÆü)ŅŃ 4œŻ–'”õŪ^¢²ĮU"B+ö׌’Ūµžž“ Öc1¼Ÿˆ«ćPōįĒ:Īj¶~·:ĘR“Rhku&eé!ń€‡ųWßFŚ|pŠw4ƒ;Š>ŹD“zŖˆč•z”ÆæWdggēؕ.ų3ŲMQōū}8“‹8é±$‘øūō ’*)Ėš}:ĶK^cI›eV«zžÜ°łÆUncQR1”‰0oŲž8¾–6ŪRŽ“ ’”q|Ų¦Sij »„SJvŅœ½½v\gßö÷żŁöLT!˜”³ā8čéõąäĻ^*¬lģ:½¾IčT„`\e€Ibnn¹ĒDĮĮ äø)lӏ‰ńt?—©×µ"›½Kµä¼Ģ!)kl>|©L ”Ū@kš!8Č'Ī~-¤£Ŗ„”‰~ŽŠxQ³5Ó^ŹŹ%¹‡J¤?rƒxŚR+×d‡ā—EžN·ÓéŠ'd¦x„+†‘S“*…|’{ŒV+RĒכ¾+āvE¬ŖčIb”‹K­zŗ6(ÕhT#ŅzĀYŠącŃѵeźo£ĖrF&ŽxšJ¼1`žH^Ŗ¢|Ä6Ņߥ„ė©ō[”J½Ø•üĻ ķ± 6šńrŖ£kI$Š^U˜2%4Ēi.ˆĀ¹žXH“÷p¤yņxd»_Ó0dT=M Č ±Č^jėŖ ¹æŸm//ū«õģš¼āR¹1ŁÜčJWŠLńwż\u7žĀO˜Éµ·{mqvĢ»Ž0× į›˜MæõX“šÅūń±&Żżæœj,:§([?ÓčqF6O8ÓųaœŸBrS "9ēį¼y²Į v¬oÆcŽ0ąlmpĖ%Ņ`ĮurP:y«śZŠÉ,õa4¾ŗ¹<žps5ųål\tŒÆōōa׹hŪƹK+UŌ¹ž‡ŖӍT7Ż\ēu3Q -¹ž–œĪ?$L½9cž‘)ĆaÆ)h£4„¦Ÿ‘óīb|öØbJ¤ƒ76Õ¾øy9#»Sæf}Ż¬„`×µ.¤ĖmčĮKh7čHI­,×Hä2ØvĶ†§²ę8;?9ė»čö, ŌuÅcĪ”¤4ĆZhĆFs™SĢ' ł-_Ń”üańu€ļ R©|‚Ņ†©©8jQB{WĢė²ēm:’Srŗ$6Yo‘ĻĶ¦TŌ7Ÿ|^UĀć²ÕįėV*¢¢H·†¢¦)Ÿ1<•šÕ›¾ŃMķ”’ńį”…9šó›ÖßµYmSāJžīÆ8CYŽB±j>¬su'BŌŌE`“0^kēՒR†$›:Ō-’ū>§“h ŃŁZ>(IŸ—§Ļ{7æ’3žĒ{Ēæż¶GæQ'ŠW‰?›§ŌšŠÉĒ’8<łųé3I(é"įƒLREæ <½/ž<ŸÉT3µĻєzģ¦Ų‚äŅ@¶ŌžżŅ¼,ŖŠl“T%i妎µÆē£³!š™fhM”x ~]4Ox¦ŠŠ•‹8@ -`s+†źłazuõFĀx¶LĀRä0yKćŪ¹ż -Ÿ#y»Œ„PփrńAaÉ%¼DŖ­ U"9®ä|9 J¾±­Z+\źYĶY-?|ŲļkI®’·š—/3žZ-ī#NF-0É,śŽštDļį÷°±;b&䜘Łš³_%¢²²+štżD³ų{"”hßĖßTJXa_AÓ*ÖQn³‡3a˜¼9;ńö_„e¶Ų“ċHÅüŪ²ĘÉ9Ańda>lŽŌ-R_,‹ĢĪŹOa˜U«P¹…÷ų8›j—čj){5”ŅĖĘāĘŌ’Ń AJĪ¦‚+,"OĶ—©=…Ł ųšzHßøš ×Ō*Š‚w”x& Įž‚øZ¼ĻüUCéRĒ5ž»ü`…Óh-:jæ”0”4ézČÉŻŖÆ ué].'›ż‡xYźw„|脬|×5¾Ķ²0œ‹d{qŌ•¤ŠvvFMĒķbžk¾#av8CNęQÖ ¶8«VŚvyEAķY§§vg<ųćgŽćĀ£¢‡hrROEā)k†3¤Äc’VKdqŖ;£ÆŗWĮ4„^•ŁŖMużc§63ōź­_čūpFåę1ńÜB§ R:Ė˜g“¦Ā²žÅłćm–Ł -l{`æÅĀõn|“5¢æsDĻ4“!W=€ŚęźŸø¹::Įnq¤2»µ©9ćŌéŽ;ƒ›”Õ3mä ā™£ūŅčįŲó¶¾Xk¦Ę-N0ō)#JvƀR#ĻųŠÆ6<¾gŃ×|1”Č’,Qk<Ŗą¢‰Ų€ŽjµiOsc,ŻKD‰šøtć°-0m2’źˆO&•.ļó›)±Ņ ž¢ä»¦ĻģFß ŁąvTWz08É 4ź ?Ŗ5óĪį€-t±k¤¾ŌÕ¶ż¹Ņ±T‡y’«-cOIõį9š•ćĻB “Ģņā|į±”õµ\ēīIY£/TŸÆ¬¶į3 -Š7¢|„žŽc‡U_ 57‚ĘØt¾xƑÜU,k&³:¹o €Ćs}.Ų]OėėŠN4‘Lęž# -ŻK]iž¤°ģ(*»õīØؙĖ?ČČ4–ĘĢ‹£[3ŠńBĶ_:‚š…8’iQŽÓÓ©‰Ēy”‡%<+@¤5ėŌUk+Mżń5Wf&I“9ÕmxöšD*ł5Ē»ĀXՌ.źvĪŽŅmö;öŻŠ5»ØŲŽY±C”T£<Ē1¬”½“/•L_Ā¼éėmÓū{ü“n}(¤żJ’p¤ņüSZw}>Õ¤CŽ ’Ēš/¹öµĀ²ķrĄ„—@*ų°Ya.'|śz)bŗ—8Önb‘ˆ‹¼é’Ctļ¦«5<²Žm²rō÷QHn¹ˆRœtų7’Ņ¦t²y~ńTŒ I"VÕAź#ēkŲ%ŠHÕŹō©†š©Žš¤žpī tŖ1ęæœÕ7ėøU”/bēLGј#¾UĮ4D‡A³­wĪ¹jS‚Žr_™ż„Ų*D¾õŖę5Ģēqé‡?ķ]}XĪfżŻó]īīO›½~ƇČūų÷ĒæźūótDŖDµsłÓ_‹Ŗ“Ļ‚d)m#c;Ł-õ¤*5™.*(s+×øCŸŃÉēĻou³ĀP’ƒ$EŽRg ;ątūķĮé8.ĄēM9ŃĮ#0ü¼žó„ÅÜB[ä6ŽäébāéY}·īL·įśŗM÷J%jŖį–Š>ˆÕÆĶ[Ļ[~>y)Į¤G)OŃ÷×WÆ^Ņ?}PłŠ~/…u¶^.āX?łRØ~Žū/µYmsŚHžī_ŃēJ-"ĖālŖņįā8‰ŁVNI\É%`° I5’ģų®ņßÆ»GB L.Y>y4żöōė oŽ%·ÉŃÉóēGšŗqņ(ƒ›Ū ŒY^¾xńĻ?^¾ųó˜2Š żčNČ,…7>ž’~Ŗ’oĻÅ[¢6Ć˜:)R!ļżėōŹó Ķd0Ķ³ ŽĄę§‚Ņ8—3Į+Ó ņå#,b¹L[šd·KžŽó –ńĖuač€}5źŪČ8ęĄ³-·ö Ū÷ģĮE £9ō o_Łīō†-„šµƒ†ēpe9ŻKü×ģŲ}Ū»f©ē¶7 ‰ē(Ņ„‘éxvwÜ7ā4;£”k™Ų³ŻnߓƬ^Õ@¹`}°ø—fææÓb4¢l.1ģXجŁé[Jܳ«ė‘eė§.āˆJö[ąŽ¬®MÖ' -2k¶i‘³kż{Œūš=ōĢ+óm4*UŠ!'uĒŽuEŠĻ‰•;īøžķ= .†Ć#ļZĪ»k¹§Šŗ ÜŲµZ(Ä3[ō¹ jųŸ;c×&üˆ—=š,Ē<{8h"!ŌŌDźc=°ĶÖŠ¹&¾»¢/-\G·øp&Įį"€]Ƽ„"ž^ÉXX}ūĀt-z;$Fm×jrh9¶K{l%ü£‰’Ēd>; uS„pn±kĮ>³÷Į&åÕf DÄ.ĀWŻq÷²@_gĘūğŻł7‚ŅŹÄŒ cĪė~Ž9&9Żė(ļ×UķŠV]‚÷!VÄ(e:nśź_|urtÄ5UąŻ -WłE+ ’=:"īŽĄµ«“į«GĀŌ§Āćė½Ü,°Fcķœ…9U -|Ā²„5č«ĄTpŠŒ~Œ‚ź—Ā¼Nų ~š®¼ä` Ksaų†ńJ3MćY€ {Ž/%–`ŖĪÄ µq'›ėĪ„“vļ‡¹hŅŹ#·ß *ń+³~ļKų“z²zF 31VČ;­×2‚8”¾ć+?a/’Ō#Ø!%ģ%RP -?L|3+…)öéG¢›§$™=yF½–6¢e<”ÜśŅH›?/8`–$*Ÿ=zt•tÕI}š"1Epī~^Ÿ+TéųKt\Ƅ‡ƒGšłĖ„¼Q4nJ"\“Ł>E0ĖčOi’ižõ*œć„…Ć£² Ņ¤č2Į¼ź0Š¹Å›všVeŒĶĖĆ:^ŒÖŪa…Ž9LD‘:°„¬“±‘µģ+ĪqEF‰¦ū‡&ø 6‡”cŠnšŒ&ˆ ė1‚“SLÉ(¢Įz€ØM)²\FpóC]ŁQ£„A -Ō`±ž6hÓ!@ ļ…¤£-Fbįēa¦NĶā>ˆó‹]°šNTU: ¦bŃ#‚E SĶÅæ_Žš ŒBj <«™ØŲö«ZĻ64¾=Qö4>į4Å*ŗNķ'g­’•>ņģOƒÄÕ RžĢhŪ!ؘ³™Ął_eŠ,—’p]3BŃųwß8T±å¦lKՎ‚]՜ØEpśt†Otdå$ž†³c'43²­ĶzŹŃÅ8ŖNČ£ą¬FĻ:J.˜ėc2…\UŠCż¾” ^,X€ń ”1jĆoæ­DyKU"śØQ$µĒ &o@@—wųĖ[µ“Æ_ŪžƒłJżęf/ž¾³Ē¬Ž g -źó»?’J7©|MYö4ßqž%9_—ž€Ūu~/ä2ƒ±ōJ, ęяDNŌź7P¹F›iŚüü”Č“0Öįčˆ4ļé"!T7"a¬~ ŠĆ$ÅÄ0U£å` Ź*žtS‚å<ń`kōĖć:Le|'"tJ4§ā@œŌuųĆ-.Ė<¢Ań¶}`pī»Ż8 <ē†ņRŁOc‘”˜ļŖ9čłģŃŲœUv֙µx(Āh™ £ńåK£üSŲ[4ĢgxpJB `C]*ė‰kLĒÄĒVenŖ°|FŽ;€ n!… }‹¤hVł%1Ą/*«K’®ĪāœŖq”w…ņį–BČššAU@©õ™ųżÅ„{s ĪĪVčMŪӋß?ŻZ'G)MĻX·]“ō©ōŲŻ~ų¾šõ‹æĒļ˜€ę×8ˆ ¦įsą$„kßp-¶½źnŠE„"—qÉģŪg¤Ī>-“o*N­ey¦MXåķ6i^”żƒu†6ģ^`ˆ*›ń‹˜pˆnAXßŌQ¾r­ĶŁžviŲSjt½’uĆ dĶŒē­ź.č'ĀĶŪ«ņ{ģrĀŸŻVõŌØŌ%œ½UµÓ_Œ ĻL½Yłˆh;'“BŸ©«7ŽŪ8uĢSu+RCÉl¶ń n(ćŖ·ėŪś^¹üŠƒo³¬ķ2£tTÜøx ]Ļ&“s»oM&u x Ų±žaoĆVųW³“W;`²ņFÕ®[d§±„\ccÜ¢ l†o^·§Ööųn{é5 F³ŁŚ-¬oŗnßv=‡Āø€@£Å9T=&µ7Ļ“­•køwL×bą“)üŻŪĶ±7ģĶĀt - ƒ¤ĶržŹHł—öą?©–\#ŚśŌµųGHmXĶÅ z®NŲĖ|ó×ŲĶoäX#kPņŹö%Ģ6« NÕ²»£ä«˜Į‰15t$5u%ē‘lc}]¶ŖšŲ6ŪŖ;°¹ćŠ5OįĖz©ō³ß)‚WÄŁ9fŗkśó“²§zzĮ=/OWš|?śĶ<ūsāČŃæūƘsm -ø{½É„v½9Œå5 „Ēn6ē+—,  ³Xšć¾Ū’żėī™‘„ ŪuTrk4Óļžžī™žµœ/÷öüqżČŚžņ!pfóU­{÷öķ?ļŽżÄZĒŁ‰kz7<ū`Ā÷ŸÆõ÷›Dč–ė2‚,ą‚·Ü>€ē84ä¶#ĀĄ¹^…Žļ1Ó³ŁJpęxLų«ĄāōäŚńĢąMż`!źģĪ ēĢč_²…o;SĒ2AqšgK,œ0ä6[ž­cĆįÜ į?šø®ēx3fłžķ œ  ›Š/–įM0Ŗ™²|fÆDņ„&0‹hĶk’‡“¦°kŽŽ’ųŒ{6 rōąeį‡œI5>˜wdSž4¼oŠČ“›‰%·ŠĻÖAļ Š½<éhB$$ŸwFlŌ?i †żĻS攝|…AƒµūƒÆĆĪ§ó1;ļwOįˆµz§š“7vN&ć><ŲorŸŒµz_™ńßĮŠXČ:ƒnša«7ī£:ėōŚŻÉi§÷©Īi³?fŻĪEg 3ĒżŗdĶČfż3va ŪēšµuŅévĘ_‰źYgÜCŠg@²Å­įøӞt[CÄ4˜ ż‘ĮPÄÓĪØŻmu.ŒÓ`č2ć³Ń³Ńy«ŪĶ•„HŠ‹O `¶uŅ5$9ų“34Śc”,ž« z&»u6ķžaü׉ZĆÆ$!Ąę‘ńŸ ĢƒqvŚŗh}«)„“ƒFjO†Ę2Ž?CT£ÉÉhÜOĘūŌļŸ’ęGĘšs§mŒŽ³nDŠ›ŒŒ:·ź8X@k0 ŸLFŌāźōĘĘp8Œ;ż^ ”š4œ¶ś”tŻļ‘Ģ ¬žš+āEe)źģĖ¹ĻĮģ= -ÅØøŖc -l“3*čsœ–õŒOŻĪ'£×6p“ˆ¾tFF\kŲįœŽ$ž„”'(> x“&ܹN¦e3Ö:żÜAęådr ŠHG¹<MŚēJūzeü¼4­sĘqYµ`Åŗ¾iÓssk, åVnGł9Žj% źE;ūŁ…ˆč āčdtŹŗņ+ īķQŒ–9ĻłˆóąR3ĶžooAp«Ņc§NĄ-ˆB#Ėō¼œļ% ķ،ā]»Ū€ -qrŠD RiüCY<€HxČFc-ż@AjUœ‚zå®Cś6!H„z{IȆķ«žæŁ1{ū>;+ž3‚_³£œ rZьæęĢčĀĀŠ&üķ}L‚ō-ģ@ģĶrnż%ī4ļ³ƒsī. oy€a]G"*mŽš;3ÉŅ‰ē‡Y„S9)ÉåźMWžEéĻÕIĄÖTU(#°(—%>op·j|T£ ~Œ_Oł^Čō&-üž[øobŽ3÷ķÄųš|ā¬ŻśŽ/_Jˆ`åUkIOĄO,¦%„XüÄ÷CÜ\Vkļsę9Žöąc €§eŸįōüŁˆÖ·ø¹)«źy3J+W+č•Zćć­é®8;>>fćįÄHė>ž˜ūwŸ„·ä±“š9‹ęń{'¬ĀJj6iåäĢś^ZåĄYqŲīņ<‰Ļ7ąŻSg›Q~_\±ŸgĖ57'Ė· ŖŖ°åĄ >~PƍŽųĻŹįįäģÕŚn’Ļ²X±8“`„ÖréŖ¢¤ - E‘EHjiżĪŌš3T±įŻ:ļaŗmÜ[œŒĖŽšĶĪ&‹F~Š,¾VĮåŸ2S~ČÄĻuĄĶ›üįllĮĶ§ęŹ 70’ącāń{(SńŲƒ#’X®[ZD¦¶Ć&Ū“ĢŌ -ųŅBY›š?ˆ³ƒ×Ėē>'V>%:Eām]«/F;ƒt~77ÖŹĘšo+.Bˆp¬‘«ūƒżäŠ·Žā„JÆĄ\°D˜¢ģI„J[RæĖtżs)·ąén”ʛ|õLf„ æcz·ó›V0£Ć'HģRŖ(H„¾įž„A¹×ɤq¶@©_ZŁ%čYžbi–'Ų¦é;Q³šĄōŹÓ+€GPõW”ŹĮ³ōåXiź}šŽį^£}ŠŠXŚm#¹€Ņ‚Nē€ļĖ4›½~ĻČĻsh\’ī,ß=¢ Č„xņæw9¹$ć.žtēӝŻ]É~ś_© VŪ…{˜×!(9ÅVBõüYYL׍D) tĆdŗŽ)"° T^y‘šŹĻfą  -Ŗ•ĮykXy"UöÆsšģvY<`Š@nÉYꦘ·Ü™»Ļ|‘æqŹĘ•‘­~žÄ›"³µJU{EŃ“ę¼|\ÄŁ2HlEUø%FÜ Ām'ČW˜,ĶŚ ĢĪ÷"ܛ¹²–»²y>j0ā »±żąˆ+3Ģ‡Ŗʔ›c'Ȥfo -±Iį:r~0«N~æA5øQ)‘HqLA<*ȁxĘ½/AŚjĪ…œ®ÉrE†ĖY.šžo»$± DYū}ŃėĄ9KĀ5­›bŃ¢įĒŲ1*¶d’lź±Ö<ѐÅHŹÅ&Aķ„#€<—ß)ió=«|0ģĆäØÉ#—ŅōĪhśčaį:ŽČ§Z*IƒJ’{v9ŗ*‘ 隫=Ļop]Ž•#j;©FE”ŲBˆŚx,VĘqlC,ŠŠ?@JwÖźŽrsŗõhŒó5ÜvĖ‡|±t±ĖåO–/@Œx; ą2œN:ņyˆ†K3ŃÕ ÜOYTÆw¼ü6ßÅŁxPD+Ošk+Ł[•FŠ|éo·-S¤ĆĆ“)~+ -ØHU„ĮŅTg•ćJ J†B÷ŅŸpųwTd_W^č,āEPŻ×Ł0A9UņD_Įó`Ēž›ĪRńvÓ±įBypū ļ4#«.ż‘į³į: -JŠ9fü~é¢ŚAz ‚½+ŗ]ÉĖā×>O‹§(žļÄįŒżńū!o+:Ž¬ü:S^¶öUĖ(š2÷}ēÜ]bcĻTÆī†ĄŲ=¤Śx¢łÉÓ?”ŠŃyĪŚ±XJ*¹‰²78+Ń© 5nNB$'äźDƒ‚yÖht,®Ø7›3 Sع¢ćńļOQŠŠŸØuŸo \†ģƇF’l¦4ÕõÉ/ņ‹_Ł[—GL”ö9śćpi†óĆŠ?ÄŚŪ<8ųMųŽGöĖĮĮA<»G³{EN5ŗŸ3:•4Ɛƒė€œz“1’xÜ`Śą®ī|p5ŖŚhÄY~¢“L6Čn®€Å-Õ;Ēµ-3°«%6s»!‹ó`üD ķ搔$×(‰.żäēD}Ė2ŌŖWąÜēFŪ'}&¶¬ł²į/‚+A¢7|„Q.£>ņp‹P÷x`¢–Xߣńi2&…/ žgÅŽŅ†mh™Œ›5wn“ĮęH³X_X¬Ē g>6)Ī`¾ĒhȎ Ŗ£óVć؎½Yw?żՈžtō®–Ä ü`pqģ‘£¾½Fć†?Äé\,ęU -­óŗ¢Óo93‰(ɇźYĀī³ß“ fZ< Kc„gY¤ĄxirĖŃØĖš)ŁHZ“L%œ™‡Č‹TŽD|€ĀMŠAZh@yī« }Rv§+ȟŽ19ģąžŠž€`ĮTŠLƒ™:š*JÄ-;"o‘Y²‚ņ¬ˆ`+L–Š©ĪźįYUĻQ§uSļ•Ģ%ŽŚˆ6™?3vźÓ…ÆLāēŲåAՕ*„Aj‘šķ„T’' P¦ųV\hÅ+\Eč™ć Š¹:·Nų@˜¾!&:֏ģJĒöŲ ĮĖ–XÕŗ4½‡äu ŻŒ F·cqt¼…–ŲTöGĘ ŖH>DXĢw`³&SPJ8Œ!²ĒųdŻ„¹”ųDā\<,®}l ”B‹U‘ń„§Šā#DŃj “Č¹F{ -£žŚ ‰#Ģ襎‹egęų‰ŅjzZÕö°ĪŚĆī*§{–š’īYLY0ź#÷^Łk;%ā(>Ā½Z\ƒ©±qć“H8ČŃßYU­Œ=r¼«MßhČļ™i1kS£ŁŚ ÆŠ-ÉĶAKD£Ąś:^÷ŗÕ¤•tE#ąU!7mäNÆ°»9DL /»hJō¦ė&ĀŠ:4cųē_2G{t?Ś5ĻÅ镦( v,'”‚žéŖąD“#7ŒõźĒ»Ž$5Ŗ2Ģµ….kŻ°8Jų°¤†kɼlrļ†Œ—V¦ūĪ…#|eqÅ,aėry<õ}ĘZć/“yuUH—A¬‚3é‘īķ W-Ź_Ō¢ĶYģ%= *FO ^„¶d\Õx×ŗ ŪńR~Ēų­ZķĖē$Ód‡+ĀÄC„Ä€Š¼„æš’ü^Z¢1ĒĄ…Mf1cL …¼jĻĖ:·£ö 2y-(ņĖ2EAt½›ŗ–-é&ššŅWøŗ_ŠĖžL?žŗo_køLĻŚŪTm•Ę©Wn”NŒšŽX-}’G….łƒPä˜U6i¶R”#Ī£®R&Æķņŝ'§=VÖ9ŹJĶŠ…‚Ęų ˜ŚSؙ¶č('sÜ<ż /Qbŗ³/”Æę·ōdµ^ŗ,‚½&Žeń• lɹĮ%Ō™§ņ"_įŹå՜s<“ .=VŪ¢ÉgXx¾“ĪZ¶HLč]'XØ2Ś–É&/Ŗ«å+ź -/Św łŹZNņ•Ź»p©żyŌ'«źŻW*źQ6¾ģäuQł®Ņ@\°TĪ(Ü•Ń‘ĮóhŒZv^Faõ«čėIų¤ćåi{MŁ4­ńŃ“mŗƒ§äb“d›‰Ų[“c„ų7(sxōēpņI`(Å>£5ł ‡•µ?óŚČĮ‡ž÷ū”ƒ6ŅEŪ“L:’‡yXäŖäĀ¶Ōņ96§Ø3„¤óˆŌĆ=<{©ń -ÄmC%ģRl““96yi{ gE _»™£ąŽé…ø&R €;³Ü»„ę](īėŲ5óŻpįõ -ĖB5)ķ”Em;bäfń”ØŸ)Ÿ_„ō‘‡1»zĄ–«„Wp‚ø?hGQ -ī7õĒklUŖ!lGIŠoYāH’W}‰RīlĻƟ5D„»­Üā#ś×ń::óß9‚Ę·żĖߊeAt[šĀ)-«TŖ.év÷‹Ītå«Q;¹IīÅŗėąea_Q/÷ŃÕŽ³-ŗ6zņĒī9æS ®`²€-"éŸzC?˜I)r…õńč ˜?¾r‘ł„üŠūü>Ä ķ{W9ģŖœ^ų -¢āą“­ ¾ü)¾µžEŠ½¦ėrūP¾’†kV¢ÜžIš9Ė_įū[Šd.Oń‹8æ÷”’6žo¾ćUń·Cź‘D9”?h›MC+īBĀg ·æ„—Ń}åŽę׫Y%WTp×+ĮC=é@`;äŌū6ļ}÷Ōä…yåqJļ®\~Ė±-āG’Ģ{-(Cgīß]E1ņ -šr°<ŖāJ½øįm@õ§ś'śÄÜģ"-Ł‚%~|&VżźKŪ"žUÄļ{@ć’­T]OŪ0}ĻÆø“"įTEü€®04mo“Šą Peœ›Åšk[ž€²©’}¶›¦iźB'į‡$²Ļ½ēųğÆt« I—h5ew-Ž"š‡kļ”P“†æEa0A­…Æ”µøŠćb2éæa_ž©Ł€¾Ig^ļ‹ż·6ü™:„2Ą:B9Z˜5†¾’jöQüŽęŁwH’$8ƒĘKęø’°X0%­3ž9’ąPrɧ¢£©‚xŒŅµÜž_Ž…ŒvĶś=ėćŅ45t ·Ź†ß¹ķ7į9€ģ” :o$<)%ņŒ”µŌžDė…#ć -’4um DŌē—æŠŻt“Ńæ!š7@>qkёœ÷=Ūc5.G'£”Āā>ńŗČąŽ)‘:½ć!ĖŽ.5©`>jų—†ÖĒ“ą'ś•čŪ¹¼ę$»ÖؐųŅyÅPĒ’ä,e¤rŠ(/ė³ź-Gžļ˜JLÜó÷œåŅ=ųŠH–XgŁ“JK©§Ī‘Ó|§u}Ä÷)ÜPcq³ -„Iļ#’ć^Ēsb󻈝’ƒ˜Lū'5®ŃXnćĮĒ¹Ä \Ż¢rłšRpł{‹x+‰P{/-üŽŅNĮ¢ ·’ƒäŠjOO§j|Ē÷©\źŚĀĆnŖ»’ƶuń•ĮnĀ0 †ļy -8°jˆ€Mˆ;ŽH•—™5RI#ĒABØļN¤k;X5_b%æ’|æ§3—9eqOŽ”&Ųd“&āķ{"/šNJAU:GļaŽ:£…>ĘūK“¤ī!·2,‘=­Č‡\oćŗwl(žÖLžv3¶ĒEL@pļF.|äFĆ.X-¦°¦ŗ°^8hž <7Q#ĪS5ĢųŃk=/­/ļHÆ>] åćØLŲöļ®ģ‹äŖv¹o†-¦’<Üūo‚M\GĝµUźv–ź …RĖNĆ0¼ē+öŠCØZõ€B…„Ä QŽHÕā¬K‰młŃ źæćGR%i {±ĻĢĪīäįI7ŗŲ‘ÕČ>Ś™ÆwŖUXĮOQ@(Ö¢µš‚¬²~GcɀčtKIg!y“Ž 2=+Öf¹<ßa ĻG4sųč}s¾k#Žč:ļ’VŒĪžŃa2’Ńž» ø—Ģ %įp`JZgāź™ ، 6Ę 7čõ seaī÷ń^ø4-5šęA [!uS-Ąšę|ÜŠkŗņlØŻ -ÜĆéŖ~±‚2ķa%Ē~‰øé4–āźW”:’źLņ†HĀN„©REĒ -Ū]%2‰ĘśWB>ęÄ{(;-öĮŲ2±Óū‚Ųå3’’plń‰‚nœ0Z?æ*÷8ļ>äY>dƒ:'į{†7ˆjõÉÉ%IąĻ`nPN“†Ļ’s¤FŖ%jĖĶ~ӏĖŃ؞Ć>ŽD)ņ¬^Öó\±{b†ŪŒäL›Ł³C­9”æ’O(+˜Ńš¾4āēL0G‘   ŪćęvĶ…Ō -j˜p{K„ŠFYj¢Ā:(ÕŖ•śÄ±» ĘŠdLO굇KVŗÅ“åMƒJīĶvŻPI’\„±äD“ŗÉł‚qü*R ĆŌĶĘģĆP’MČ,…čUµ7™gD’šwÅM;?«Äń9vĒ§ņy=«żqü|2æC³DĀƉÉ|åCėT*$4‹źōĪ¶JD—thĆQb. H(ÅÜD„m›±īN g'»»ÖąLkt1Ė ) ~uf0™’[ømöź—ĻŻWŌźē‡vt&ķ6šćb‰ :5P¤ø|™‚Q„9N:WT©×©*¹H„Ét%ÜÆØ'ų™ĀkķL9¶IJ­"‚ÖĖGįżāÅøOQ3&§õ;ć°gO§UÜ «īÓé•Ķ]ć8=šµųÖ>~ -9ZŽ“gŗĒ}¢ru(š xX,¤ņP+Rwõ[4ŚøAײƒ]?XqĢļꚦUvšŹ[…čߘĘįŗ0µTźÅšō',Ė“ä®k6ą &īŹ¾¶Ū°®„ä½ļÖAćCukĄ­Õ³ł’xéDaŌc—v¦bCŒ÷,¬ĘŠ/žč”p}V@w}ĻāĖ tÆö?l?ZuÕ»ž/°Z]Œć«†Õaé²ų–€żq­’v¶Ļ±üŻXŪrŪ6}÷W¬3jI9²äĪ4/¾µ©Ż6Īø‰ĒI:¶G‘ …˜X”ģiōļ]€Q$H)©óR·ÖrĒ„’—Ž7°Y%6£ū•¾"ĆÜŽšÉIŖSÉ;ß8\­ēä]Wė4©ėŠ%†%(}dŹP³h–āa44«ņœ d –)] ,Ųz‹É*äŠõļ—ļæwł×łÅu¦Ų*œ»õ!Qi¬»š5ŸÜ,BĪq;ŁūīĻĖĖ6ėĢĢ·&ug½¶ŽĀdZ²™5Éu¼ųķ2>Īžx™UŽEe+ŅÅ芣ĶA/lńŗQŪłWo®ą|ƏNąÕš`xŠ?žČŃiÕę:CQO)©”(„@³=XÅjmÓ3žS­“ĆŃ%hČ©ĶOI<¢|Äņ׿aīmh6„ÕéyŁfģ‘†pFxQGĀŸ@?%tčŽĖÕöa¹wæŽaAŠ&Œ…VuēlŌÆĄī1§¦iD† nČŸ =ćŖ ŗ¹`!¼Fø²s„·S)¦€Żsģįp; MŒ€+˜^¾|.œ*{ O ¢o@7tÜM5˜HĄu«40‹Żē¦ql®E„Å©Ü’|kń¾ēļlJƒe4„ 3›Ün¤’#tÖGx!bŠ]ś+VšĻ²mĮ¹ –‘(M-ż SĀCS`ŌX¢¾®ń1’Ļ8”ģ‹V„(¦&‰żā¢ŲUl. ć[OŠŹįäēćū‚e@ł ń1ē“ź¹(/m˜o­Y”Č¾˜Õ[v}ē+?*¾ż+ø]]Z…±_Ś åcFżįØµÜłµZ’o›J’=ŶŹÕørķ6RŸtķs[b“=ĒöܼØ}Š0¬c.8ĄI£S’÷›Y¾-°`ÜÓYj»³3Ÿ™Ż™Żį÷ĻĮ68½~}B^“‰<‡Īż6&’Õ'goßžóĶŁŪwļ‰z”œ»¦÷@Ć8"曚že½mś GĖ®KŲ舄4¢į#µ‡ŠŽ]µ(õ>v|˜žMö%ŽG"Z”µ¬Ļ ŸÉĘwр<9ń–ų!ūėļc²ómgćX&2 O3¤$ įĪ‰cj“ ōā­Ćųø®’äx÷Äņ=ŪĮq“£ń‡©a‹ˆæÉ@Y¾ Ōū(}bĄ"[sķ?bWf)Ļ‹nHœˆøĄłš‚=»‚ -¤Z®éģh8lAR9»dh@[{’O€HŖ«ķ[ūõbfōŒ! Į¼ų@’ÓŠ1ŻØ˜6ql4§Æāœ:l,ŅxęŽ"°Ź -óü¢;J'¼ü0Ź€ģĢg²¦ø@ŸPĻ†NŠk°ģü˜’ÄLĄĻ°É:‹Dž&~‚Ր1Ė–YP ׌upõ…ø¼¼d”E§‰q„źD_\7²¦x^j‹ÆźT™’ó[čTČd±¼ÕŌĖ+ƒ\-fSEӉ<ŸBėÜŠŌ󕱀†—²#_²Ķ}ņü–(-5E×ÉB#źõr¦? ÉsCUōQē“ŁjŖĪ/x0k. 2SÆU(Å ¦“ŹV“ɼŹēźL5n™Ō ՘£Ä )“„¬źd5“5ä“\iĖ…®TqŖź“™¬^+Ó!Ą¹DłŖĢ ¢_ɳ™PcP‚Wž+V>Ÿ)‰8PxŖjŹÄ@ĶŠ§ Ų@ĪD_*”æŠHÖn™†08ėŹŸ+ ƒ~2•ÆåKŠQŖØbœ¤ÉJS®ųāYé«sŻP•”ĖÅbŹ,Æ+ŚWu¢čÉl”3Ć­teB y€żĄ¬Żš|¾ŅU“ņRē†¢i«„”.ę}0Ā XŹ0zŹl½˜3ĮX ķł¢1ŲT ČĶ•ķ0ķsęŠŃp2šCN ž¤‚= NY2W.gź„2Ÿ(Ų»@F7Ŗ®ōŁŅŅTiŌDų ’WØ>›4Ą–‹·;M’ščĻ;XQ‹DĖ“¶·!ś‘0ČĆ éhį{ŠIŗ5&0›@Sķ׹•ČfļY,'¾»ƒ&ČW$]r}š:„ūbóęSŁ„š>ŠČaM™“¼ZŽ-t2ƒoŌy|&½É‡ļŠ‹’†ōķ‘¤7ŚGį’ĻQÅeülV"¢ń9æ©„ņoŠ¢źŹƒ: ¾Æ -®Šr6DŠ{1NOuž ķ߇ü1]Ųõ[!ƒ~ŁŅ?›¤:Ń2õ×R_$+q-” <Į}"K9É„ś”WDsˆyno>q€ĻĪ÷ŠDRWĄ\zQÄ”.fˆøeźŒśä3¬«aÆĀi¼ĆUšģÓBć*ųŖd'ŗį²ųööoGŅGXĻ¬¬7ÓyiOrē/q aQ—"GŽI˜q²ŖR„rʙ—é¦Ļ4÷żš\MNĄ< l“oONX»BG²=”$uÉÜfšÉ4čQä9aW 21ķša -ŲUƄ=MŲ°é\FŲ{&¦{SvE”ż „NG²¼€ėµŗč,-<€#O;!A?·K€p™g'L©Ū§ø¬öō8Œæb­›,Ū>`­<+?ŽZłŠ®Ö*0c¬ÅNŪ1 -÷¦ķRš¾7īģL¶C9Ė?“ó–!åܖ 5Äo棔c•öÉ«WŠ ¤cR”«óå&ŅĮ;L2ĮgöHo ą(H~ÖZŖ›¼lŖś˜RÖ¢ē‡qŽ’2ēÓń:Ē}r!„h÷™¼;ƒxżī·Īy–„āDX[2ī:,Ž­³‹bgĘ$æZś&oyoż¤bćdŽAŖ„,æ’ēu‰ŽüIµ:®b9Bį4ѕSöŅdżöP®ŻÅÄœ‘4QĀcvĆöMOąŅŚ‡³°éõmĒü(pxg—3ĖNĖ)šģµ =wøęTČZ»źQz@™£xƒF ĻJ•Į‹‚=Ņ;„Blčˆ>Š¼3GĜŸ¤Sžä ĘĪ_•qä]'ģ€Ē±¦^›ä>–žWļGĄż™ģĘSvxy ŁėqĢˆˆƒO~˜ĻÆ’ŹI…¦|7ĆCi’ÜÄ+p6ŅžĮ`#śvŵM¢YĒåUœ˜[''³Ä\AƎŒe^÷öÕ“,[»ó‰h2 ›w`^ŗi;Ģ4Ÿ„NFIi; ŲšĢę„‹¹BJō,óö “ѐncżŃ»ļšo’ĻČæd‚ Ė®‰xl—(æ}įxwIT§dŁ‘~%æy’ī¬7`OgļKŸŽõśĀ'Ž†ž»³ś®z°Ćm9¼g•c%»•„yn€āŌ+ęłXżI“?Œ©~²®YŪ+„†E5n½2nTĖm€6 Żs°ŗoĀąąŠėĘ Šż™¤¤¢6Հ”Æ]>?oķ*‘;(p™„I!“hīčĖłÓI«éŽä śiŁIŹ P ŗdŻģŅ²V«jŸó\HwąĻ-nBė¹āgŅ³vUoE•ć×i T fż4S:ļ¾Ų@tGĄA>āģŅtŒ…`ÓŠĖ?"»»©ŖŻŻ {£ld4ź U”£7˜°Š¢‚ш£fnXLżŻr¬ęę£±iŒ_‘x”˜ūŲ'9xŽc1ŗ6p³°M7ꮍ±p;„ęžhžĒhńY“` ģŽŸ50­`?¢ŠqŌÕAR²GŃ!7ąbŲšŽĒuŪłŻG”Æ#o‘ĘmēŽ°ŻŚé²o–ŒOŗU\Uń€KKkĪ‰“Ī*ŠMn­(P:kģčžKŪōQœQ—“8.åeņ&=Š*:§GŚŲUŚE©h,UŠČ ’k•ęB~¹«£5+ ŚķłK2£v™Æ#-ų5ż–@:Å"Ü?.p÷M!5ūšą#ž]6#ļV3a‡Œ”Ééhž"©jg{\īT-qÖ..¾£ĮßĘ©imÅabFģƒ€–«ė »da4Æ^¬j'õQւą]ŃpųÆČ÷„„_ę’“t„ -”ŽU­Ł”@Oü”źmü„{?A×ÆQķolźķĪ1ŗ-6d0ļ]źˆ vflm;a“æ–0ļĆO©ˆL²ĻQĄū¤„4•žłW÷¦öK{ķĒ+ģ -Ė>T}.‰ŹŅĒ®Ė¾Pé)Ē\Ą%_č’ėä8•ĄÓ¹j‰ZÓŹQ-”źÄŌv"D›Ÿ•> Æ-ßU>:jŻĀ»V¾N k¬žü<ł/µVmo›Hžī_1U:»%/­Ō×4½`ŲÄ+ašNµU…a]£bÖeqŅč”’~3 8ų-éIwłąĄīĢ3Ļ<3;Ėū?³EēųåĖ¼K.ī‹ōŪ¬„n܃7''¾9yżĢ"ŠĻ¢ü»(Jļ#|?Ÿ4ļG‰ų@Žf–öVP%Š[‘į:mł"IUY¤“e™Ź¢<„ę ä²ˆ…^™¤yTÜĆTseĄ]ZĪ@śæ\–0—I:Mćˆ ĀŒ - QĢÓ² , -y›&ųPĪ¢ād™¼KóoĖ¢ jøĻżqĄI?ĀānČ|< -¹ēöP„kT™ščmk­=WēŒbyž į’ŗ\®cŁ]=ŠI8“äP@+l[bTŌ3l% .»tų%s-F»]ó€õtkł< ^æ61ņ˜Ņ×ECnÕc« ]Zą`ŚWœČWĘŗ%P^·®ckP«ßœŒóE¾ :V&žŲLF‰^–xĘ -}Ü~ķF9œjæąaģ»ą<Ɖ˜+ĶØŲąTÆøuÜéčƒ”„3Q|nHĆߝ¹čŪōģ -dQź+%‹”ĀŃ4¹ĒŁ²Hpöˆ<Ö3Ė üX¦Č¢ölž­µ×"„Ę:Ö’5°č׋š>%‡s¹ĪšžpŽā„‡ŚŽĮ~ŗ½—4©P§;|3q+²]Šā%p†·rŻw{m›åkÓeė/†Æ_ńĄė§y×$ėš’Ą/…ś½M£‡I@ėļĶüĆ«,hķlqŗĖ¶ G¶ėY6Ęū)ćå „ŗ{øhUųd=:vˆāYw‹q¤j¾pö^LÓLlÓ_:…īoižµR“r0š•Ž½]~-bŲ02»µsļtĖö”³ž¶ž]”åZUō‰ÜźņÆŪŸ©ÜRäSåõeo>ōĶęKń\ ķŖ½'Öig? ~#.‹\#ķīŗķW ²!ōmņźÕz`Re½ĪąķÉ.ŹY!ļ w»Ļ:ū‹‘éXQž{ŁpĀÆķ‚¾.£qAĒŠŸaķCp`<ƒłī](å0Źļ-Ō{JFŹm­ąķ˜OÖ|£½vłéfƍ½żÖ0h”ĘüWQ«x« -ÆBn÷ā¶Ū+»:£¢ńéĖjķcŗv‡‡ķŽ¬~Ÿ»Veń怟—ZW„žĖ°§ŅČķu=Õ:µX[o£Č~ĻÆØEZ<ņ\v¤ó°“ģ`'čćœl¤H£6““V0xiH6»“’~ŖŚĮ€ęįų!ĮtÕW_UׄŪæż¾¹Ū}xūöŽĀ8Ż˜³ ¾ž=Z.¾xcśØłF®™³k°žœ{–ļƒė}1wlÄCž9 lĖ‚=;‹‰=;bØhŗ8ö… dąKjV‡2øSø°¼ń9~5G¶c׏źŌfdqŠ&M˜›^`ŽéŅ|įĶ]ßrqbūcĒ“/¬É{¤vĮŗ“fųē¦ćtzŒNŌŻ%Ą‘…dĶ‘c•ęŠį‰ķYć€<{yc‘¤3nmz°ž“Š#Ó»V¢."ūÖ ”Ću˜˜ęśh4ŌˆmŅxįYDܝ”æł, Ī\w¢"ļ[Ž„=¶üp\_nį[C4˜CZGŒ.ćóhįŪ?Ā²gåy‹y`»³į -#„LMŌžØX»3å3Ėõ® —‚”¶bWē¾ĒmŸ©VL3)>pŌ%Ń*Ę3Ø9 3ėĢ±Ļ¬ŁŲ¢U—€®lßØŌņlŸdģŅų•‰–ä¾Ś4äV>ÖŅyضģ)˜“K›Č—Ā*%0"v•>ųÖ_ŒĻ«čėŹųŗaį=»åTV&Vlœ²H½gÖX¦Ź­ßDłśŅÕzh ÷M ųcGL¤b4ņ'ą”_K¾ŽT—AŅ‚;īsžŻhŚšļŃ)Ń°Ņk‘ńūŠ“²$éxqRź`/•¦L-i śØa«?Hīe8y“•ø­½ž°}ĘFō€]ŽC%sņ - ļų+8$rfĆ2¶†›f,nJŽšG·b‰”†U‘„jŠKž—ZĘ®ņćµĻ1õäw§å"|yńU <ļ§‹³¹Č;v/J·Hɱ&ƒ -%į„d(Bƒ±on6qu<éĖ£¦rˆO]¬ -*;éķ-ĻŒĮp7xÕ×nź4Ģ~ó•ÄŽ•w§BžQž_ąÉüP ę §tÖ7F„t‹ßńF½ĒT!Š•ŠŽ„’jrvŅGž…Lņ’÷ŽBĶ śˆ?µTyY [ĘļM9„Å#Ų+~Pź’}Üō¶Č¦Ö]zŌĻžĘŃQA%†ū;!# ļĶM§/Ū,ą†ĀōHœ:Bßrći_ «ƒ p+t uav¤b³h‚4ęKŖfŃG!ĆkÖCOdsu'rN·œ~āxŽļKńƘ3žo›ī&Ķł_Ž€0·šjé¦ŗnQēQ §cę.Ó4ĘzPš]5Ś“Ō·\+q£‚Ęt ¼…Õź©²ā_fcūXS¦ź«ą:‹ŗĀzwŠG; ć"ā²9Cn·KFWÅķ`XļÅؖZĻmĀĶD›ŖĖÆ’“ŽEr/»śiĢnjIņIę|m£’ ƒōłóŌu÷ź›}įŲ³’ś½ -X6#‹IwpŽ±lTˆ8źšˆĖrAÄšč*֙ўt€ēéjĄ÷**œ«Ū¤9<\5YÓqŗŽąq.׏Z™øŌ¤Z;½J3Ž]°CSó˜9`;µfŲ¹×[^,Š^|©)5·µs_+”>ĶäœĒś-$„żŻi+śÜķń±t[ cńc=eŪĢ=.‹8‡ćLżß§”ße飄ÆHr±ęX[|Ó8ÓnŪQūŠŠäü½-āÓÆI”čŪĮ“¼±ĒV5YjŸ+ōJ™Ł'M5Ź5|źP£•=J”œ,ļR*Wöع“՝¶hE+µŪŲ‹s_ŗ[¹ĀĻtā”a7šF8U%‹Dä²»kU©¾”ÆIHåTŲYxgÉ*ŽÆ*xüÆK¢bTqkVā¾ćY3 ĶķˆŽńQH>Ļ”ćŻƒ£įʦ”Õö©…÷9'vŽÖ垔հĶՍ„®ōšéFgŪŻŽ2©mā7“ōx‰£{fē”¾1&ŗn]ZżūwųIČoųhčwŽŖ¦„v·Õ·Œ7gā' !žW#=’ QŹé·ęŌ‚~9åwŪŽ’ęą$ߍKåŚ Łf\č7ü®>A%Är>UĖ]1©4ÖyY¢`*(­wplķ"ŲTČyēYM-4«cWŪ į4¾ļ µ„Z4#³‚_2¼­aņźł]^OįųÅE÷…r‡Ö7”ęPėõšćØ5ČńßóŃ’µUQoŪ6~÷Æ8yp5É -ģaKׅ–h›€,y"ץ€B–hGØ,z¤” ņßw¤¬YuŪ”/Ӄ-ńī¾ūīćńųž÷Ććatsu5‚+šÕįE—»ĒĘł%¼»½żåķ»ŪŸ~¢k “*«?KŻxŸį÷ż¦’¾.äMŖ -\“-ŌO²øĘukJdQšF—›¶)U Y]@k$”5Õź\ŗ•MYgś¶JļĻeóJ»Õ6°WE¹-óĢx3ÓRļĖ¦‘“z* |i³$āT•z.ėäŖ.Jg\Š^6æyĮWÜ ØmO*Wz·¦Įzš ÉZŲl£ž¬©WŖVM™KÆCt) Thq†‰ėāŒfĶ«¬ÜK}żl0ė@—ž V[“Čš"ĒZ •·{Y7Nōop_:hŲgŌeV™ÓøsуB†%F²t±Ö§ĪöŅ;ė°ZĢęH¼ĆRŚōDöŁ l¤m$¬D¬ 4JŪ3ČeÆ LˆW IlGŲ¢”SÄØm󌯩ƒõmf2·}†±„ķ>mŪ«īĶ˜A%bĪ8šx*V$”€ļĖ$~` `²F#?^®6› ˜Ēa@$ -p5 ›¤"ʅ7„cäwxŠF¢5ŠĖ„rql± āa‚„D‚Qī‹ü0 X4ó1œš±€-˜@O{5ś`ˆ§° ‰?ĒO2a!k—uŹDd3N1%%IóӐ$i™&Ė˜S°%Œū!a \# Ģ ōFųœ„į7+Ę"†åZĄ E²dŅ.°„śĀVvzóQG$zĄ—Ōgö…~¤XIÖ®BŒEdN’HŃķ™ać3ĪŌ±›ä§ ]XāńŌBńtĀ© 0‹ćĄ)ĻiņĄ|Źļ Œ¹.åŌĆ$‚x֎(Øšń}’rfõ³X,4IŅ„`qt‰"¬P!dJ0:pZĒ‘«Ŋ“µÅµbø­š`5§øŽŪ¹Ql…#VŽśbč‰YQO1(": ŁŒF>µÖŲ­§—®µĘ­ė’ÆfNmłnӐ[÷:hgĻm-°)ąYņ³k T„ŪWyźĻź÷'ćžåŸ³“ĒŠą‰­TVøõ¬Å3¦Żqū±åž4Õ~ ĀūŽ ÷NÄŚ8F@Ų}v|oFnŹ i āQr)õŸ=mų{4²A8Pķv8·ŽköĮ!ń„.žjKŁĄo0%!§w'w±ö“Fg{Ų(UcxĒ Ō>9KŽ—Y°Ŗ7ÓĶ‹³˜×œJłĀŖ‰?ŲAx#“Ęf6w§«ŖfłUŽ.eŻ»S—‚żų#“kdX’Z×RŒ[oēb’•× „]3_±(§ąÕ[YsŪ8~÷Æ@RŽ‘”Š×d󰶕 -Ń1«dI+RÉøœ”Š–`›eŠT‘”™ńßn€D‚0}efł‹D£/4¾nŁ’mq¹XŪz÷n¼#`qŗ—1iN[ä×ķķ’lüŗ½ó‘č”OɁēųW4Œ#²ļĄūē³ō}sF?aoŻóė‘F4¼¦³MųŽM#:s£8tĻ–±ųÄńgdQāś$ -–į”²/g®ļ„wä<ē‘FnÜų’!ū,c2fī¹;u†<’ ēnÓY„Įµ;ƒń„Ć?ųx^pćśdų3ūE¬ÓœĘ»‰^¤¤[D‚óT©i0źeƒ=±Ź"[ē,øʦŌS~»SŖqnH܈xĄłˆ‚żYA+:õwNĆM…6 UšKŖ X;[‚†Æ¤IlÓåœś1szŹ:nĮø@’¹ÓŠu¼(6p¬·`ˆhbŸŗ¬/ŅųĪœ¢b…óƒ¼9Jē¼‚0J™;wäŒb %”ž )Ę č2bJø›€ß ”„p$ēŠĄ=ēń DCŹ, ³hA§gŠ×Åč 1¼|hQ$Xb™±‡ö7}dų= ¾š]£KN Ń Įšdd~9²ÉŃ ×5FŃū]ųŚ·GęĮŲĄ‡·ŗ=ß²Émz’„æG†e‘Įˆ˜Ēƞ ü@ĄHļŪ¦aiÄģwz殣’¢ąĮ¼9°IĻ<6m “WĶt&ƒCrlŒ:GšŖ˜=Ó>aRM»A¤N†śČ6;ćž>BNĆńh8° ‚&vM«ÓÓĶc£» j€\b|5ś6±Žō^Oj1!š‹  PV?č\Ü5GFĒFĖņ_š#(ŁÓˆ54:&ž0~7Ą"}tĀ,„¾ĄŁ2ž;:h']żX’66 *x©3ĒØųąYYćĖ6ķ±m/ƒA—yŽ2F_ĶŽaķ‘ŽĄbŽ[†Bl]Ćvą^ƒfų}0¶Lōņ2ū¶1‡¶9č·Ą ߥC ©½»Ģ׃>³œ5 _t -|;2ą; {ŸA1:NGwXąĄŽ-R‚Tš§-KśĘ—žłÅčw l £o¦e“XhL iL.ü›’Ēh>4Š’ĀYcCKĢC¢wæšØ<'f!1“šÆÖøs”x?ŸĪōŹ¹ 8­t˜±^ąĢŲwg s,dÓ­^Fłœ£ZZU"Ÿ=@D?bX]ŅćÆŠ“µ¶Ę0T¦Ä¾¤„į÷TiņēŚvŁŚ"Ć£!łøłph¾pböuFĻ]Ÿ6öŹ“'?44²³żįćĒÖ#pĻIó §šedV Ų’ä)š;IļūD6ffĀq3SŌ¹aÉĻø ś€ÉŒ:½Cg'|gš<ŠAŻÓ!Õ§¹ķÜõh”pNėXsn|*—Ē8ķrŸ+å|Žq$¹zŸ9® 8ęgK˜ł5Ā—ūYhG;‘3dīŠ™‹„ˆCd¼.¤ Ģ4ÉÜ«źė¤ečs G4Zz±Š¼UéQ–Éše±n¬~¦z\%ÄÕ³C ’D¦„Ŗ:ÄWä SMŅ^1׊ņl“­€CāŅO4¶±!*[€Ÿ;ą\d9ÅæĶ'IŸ..ÆL®č]”öŹ’q”D+“·÷ ū¾ ßßæ/:3]†!ez5™œVI±ÓõųĒ^©#Ö`iēÓķķ¶=ĮzŖį_~Éøžī@C‚Čų=źvŠ1‰2ų$%į>…’NŠB˜#·RZA>čŸē²¶Ņ±CĆRp.å^÷R«ßøž„Ŗ _Ė¬Ue®“]IėČÉ -ćäŅ‰8ę`9½»Ė~jPą-#ÜZH’§|x$oģü`Žj³b` ėÅIgŠĆEÕó•^gŃķxŽd åäAؙ8 -5ŃH1zOžha{!žWe$čÓ›"ve2Ä4„É”«%M ižŹ!“T5×AT "J½æ'Ó{“÷dē)āYåXWžĘĘŖ|!&r|Ē¦¬e÷K°)…:P/*0X z )ÜWY¶j@[ė -#ŌčæbmE¢‘†ģ“†œ-qäcķ ‰” +‡bīˆb°€dĘg‰Év=qŌ8i?ĖżƒęiŠ}*Ņex”Ė‡’ ŗ…ü&kŚ$ļßd·œ a… 36’åī¤é0©NĪ/*Ņz¾š­G%¦ÖRŗ–ĘmęøyŻNÖ*č„$aźL/9ōM"Ü!IÜؑ¶AŅ1]Č1ŗqćé%†sp°X‰Ė09üĒø涫¢é:µč¾™6_ ļVeĕ ŸrRšś@Å|;w³ĶÜՃ\Ź3õč[Ėź#ŻŒźiƒ1ū*ŖæŪFæk)µ(D?®‚ŖuÉ¢3éõ:jć8ŪźUk^ž”5•Ļ;¾†ž ­”R›%®ÉŖ*UsQb/ĀĖéCŽ5ķ¦UÉ"bSčŠŖ¶³Ąŗ"¹Ŗķf¶?Į_°ōu ĘR¹+¾ ƒ›¼( Ū)]`kFŁüų¼©“ģ-_tÓ0ÄC”K¶ļ°“ĶÅÉĘ%[‡³C6Ņ\śōvA§1;”‚Ō†kˆÅ­Ķ·JqPeŌÜŻe T ²kÅš”¶śER„ÉŅ¤“y¹@RjĄg%I®_Ūj··eŚ=qĄŸ8ŠiYˆ;Ö²Q~äČ*ż$+pBzN”!Ö}Ķœ@KŖ&Č՘®„Ūābä4ļŹ†uÕē’‚]„EåZ%£Fš$Ō)”½¹„:»(²Ś|„ĘgµVjэGĪŁ~’?³xžéu³²ÖMSīß\Č®Ōd’EdŹķ'ŌbŖeR=,d„Ąy2~T1}RżņøD»®BnŚĀįT«t)ś%\$…ŲU Ļņ„ O½ó½^åē#k…Y¬ā*x‡ł@•óž”>/YEdžHv\Į„±”„k“<‹ā0Š"oB½ˆŹŗ/œ-  "ö`Ŗ7QŽF6æJ¦åzD°9ß+ŸżF@¼ŖqCAʟAų.É^$\ÆhvV:įš‰$­°«'щķ¬#‹*pJ½Ō|rālmŹ&‡Ņ·¢`TNŽ[Ø»E4N}µó£ņ ē˜ģ+€†YÆ[eH‡U{Āx³Y]gWsՙjü(C0»=šzæž*L ¬:sé5”å_"®l¾Õäђŗš›§ĢČ?j^wŠYg'_éęG/Ņˆ—¼š|Yž‰Õ'ˆ©ģüĢ-Žż©³vŲ˜ż;ō3y;Mč -Z9ß}ņLĀÓE:_Äw$æ”—ŻqĄÉAœ·U GķŸŽrVʋ›¶Q\ė;Čéģ䝭¼‹øÉį8‹T m±.ü•~Š ŽÄ'®ļ¹>»ö -ø~–m_U“֊Yå„ē-±dé®bÕ#ÕMu%H4öŁ+ņqÕ”ei>5š?}:ń‘–ßaĆTŅ0<¦^-Yx”Hš ¦oŁŒ Ƈ]c‚Į ¾Ÿ9a9ŚķÉįøßĮ»Ģi‡ĢaŅ>’I#q:ų%nŒ‹ė&>÷ke‘ģė|"ŅżĮ„”]=‚œŪx’C€”tĖ¬nįŹQĢł"…ń¬‘ žƅ€aœ†\E<§Wi¼ņj-fłnLtåVܦÄG<£+WŁi ¬I8T…h*XųI#$ŪqĢĒD¹ė„›jļ  ™]’GÜĒ•@²{+6M1°p+”’·ł–„.¶ŻMą„`ų­Üš'ĄĢȋõ[Å~&>­Łž+[(Ż?øŻĒ… ˆ[5k|*¢X|Ŗ _öp’ā^C±_üĄöØtĖMÜO«s|ÆŲś¬˜/būĖn›£¢›mńīęĖ©\r5‘ģq`U¬ź!æ ÆŗšżŠMa°\ČśdE„äRRō§+3e…Ÿ ’<ó’JU+iqŖ¾Ū‘ؾŅńōy­ēĢó8šÆ!ž9°Ā÷2“Rüšep„^Õ~yńY÷£ˆo߄PÖ2ŅųŽŲĆųĶ7Ų"<Śh“C½gu$2©éI7ä˜XĘė}i·Zö(wY+„©8ćżÄŒ„Ļć6Ļ*wÓŲ·\¢Vju‰~Š^`©ˆ}xģńŁŠžŖT”`#Ÿ] -²jH\!S” ųüC2`~pü9PŠEÆwnĢFģ ‡²pņGü_¢ŁÖ4IOŃ¾ēŸ„’&Ź7<ņŻkŠ~g/åzæö?QANĆ0¼ū{ąQÕ< ¤= qAˆrä²M6…k[k»!žĪŚi"¤^°dYkļĢĪŒ×~šŹā‘‚Ē–ąm æoRtĘa·RŖ®*<Ļ=xF&šČ¢ƒ^ŪP6}FĘ6BGrE“C gmA&Ap‰…¢×†‚°fāSC^¶[ƒöƒ8X£ŌĶ~Ŗ—ŻDėüėĆ’ƒXĄĘ(ķ˜Dō‰ŗ„šŌJŪHÜgO/ÅĶÓ\+•õļyUc ō‰l1½Ø.^£v6€ė'Ē  “ŒĖ©ĢCĀ…jbl$B<Ā®Dņ˜ ožÄ““õģv…cŠ‰ķØč•B2ńņT—Ó§½Ń-ōɶYŲųS·×cīVźGżRÉnĀ0½ē+ꁔ%Ē„Ė µ7!c ±dģČvh«ŠƝ&i6Pē4ŹĢ¼ĶY¬’8ń>Q`Bį-¦Æ”Ŗ÷§ŌH.ń¾=lŽµ†56ń‹<%Xa#U1s5 ŹšxĘ -“QL7Qe0)ūD±36ü=S”X4F5,+…æP0æŠÜ@¤°4©WÖjZÜīé¹F×­+ŻqFą -b˜°Ż–Ø Ų  R©(&1Ŗ¹Ā:»iīŗņMĢōŻCe{Ł,O¬Ń '÷'żyķōāżuW•©±A¤xʚ¢&;;"2µ5°\Ā“KÆ¢&UnŹ\)ŖSn¬‘ÓhŽYkõfp%…Nwöy²¤F0”$³¾VōĄ>Q¾=ś… niĻ'°ŗwn+'6ńÖO\f^c_Ļ,„”éĄē3§Ü(N²[ E>«ć°9fĖiżĖGĢ8E>ƒEŻėAŽ‡YÆgŸEīQ-˜k;eĆį?‚±ŖT"5*bw]ź,µ‚Źćŗx?µXmo›ČžŽ_qZåŹø¢IZ)WŚdÓŪ$Aė€/ąd£¶²°Ē(,'k]õæļsĘĘĘ@¼½.l˜9ē™óņĢ™æYĢo×Éū÷źŸŽS7]¬²čq–“6iÓ§ÓÓß>|:żxFF–źÄAņ$²\ŅļžæŽ‹ēćP|.Œ8&… )RdĻ"<ŽĢ"®#™gŃx™GiBAŅR -Š’é2›52Ž’ [Ń4ĶęR§—(ŸQš©’t™Ó< £i4 @/pƒLŠBdó(ĻEH‹,}ŽBÜä³ ĒV§/QņH“4 #֕Ji.ņóŠu;%„ÓĀĄIBk)sų˜0œįƒqśĢSE“4&Bß!Ä"I1@«lDV,ÄŹ“8ˆę"«FÆÉ2XPŠWa".aķ’Ń8Śų¦“å\$¹JHŹ'Č[ -”ŒęA.²(ˆå.9*± -”äP“Ė¶ˆĖ&Į\°‘V&énZnœXc¦™,5V4L:x–’HBęģš§¹ uč€Ā`P˜¦˜XGH¦Óü¬)“” 1a^B?b¶fLÅdMJ)<óo,<ēŹæ7\“p?p;«göØó€I“ŗĪąĮµ®o|ŗqś=ÓõČ°{µ}ן }ļ šļ¶ó†ż@ęŸ×ōõ­[Ė‡¤ļč;Ķr®čÖt»7x4:VßņŌŹW–oóŖWXÖ įśVwŲ7Üm0tŽg»Ū³¼nß°nĶŽ1ĢĮśdŽ™¶OŽŃļ7zgŹ® †¾¹^Ī÷,×ģśģåī®‹øĀŲ¾NŽĄģZ|cžiĀ3Ć}Ųz }¬ą™’B2Ō3nkų«UV‰'®;tĶ[vĄ¹*ą¼aĒó-č›tķ8=• Ļtļ¬®é]PßńT ‡ž©c!ߊyHˆ"¦qßzĒ³Ą³lßtŻįĄ·» Ü#b°ŲBOÅß±•’žć>06F„G§ū栃½-÷LƒĆć!Ø]æ,Õcæä8Łęußŗ6ķ®É³ƒŻ[žŁŽRĻµ<–³ÖFÜ°`ČįPɄėŪåu•r²®ČčŻYģÄZxKDČŚŠ 3Ž°{³ÉHu'}]“§ąQš“§Aø –ŲŸ™zśõ“ģė®Zž‚–~čä£Æ1Ŗm"•uÆGżõć¾'oTå‚#‚ü™š„Č¾®Šß()>(‹¹^”‰ jŪŹ›IŅ0p±ÖA­–’³ ė,£­ć •źe™Žd”S›™¤ó<āśÕ0ū$V £ćÅ5jB ā(6m˜“ŃcäĖLų«…øh02Üx”Ą_āģĪ‚•Ön”ĖÅ"ĶŠxeȝŅVƒÆ*Ī‡³ŸZtł™¾s ĪĻ1„½.÷éģß9Œ4Č}¬H}܊ģ¼ƒ4]&Õ F8“pāšŃŖéÜęHßĘ·T–W>ā#źĆē¼­§µ$¶a±Z¾~¾n£ywG‰[ōBŚ2ńŠ1%śšJ,ł«Ėģ%O;Źń[]$š’ö6JFė“*}ć˜)µ""Ķ|h·«x|å³,}”D¼Šw+yaC#{Tżł×D,Ų:­¦Ä—’’|Ŗµ¶«Dļž%ßqĖEOIś’p£Į[›h¼Z÷ƒ›:*™q¬:©ćR­¼®-׎ĻčĻF”}åŲēj[ż±’C ®ˆå+éÅ Cļ•ČAny­m÷óką„żžķ/³UųU7Œ¢ÜhG\]_Yg[”xdÆ8€s9Վ¦Q,X¹’łrÜÄP‰æŠćŹ|#÷–I%O%”ƒy^ ŗĄdEU®4ecNõŗwo/©Õ¢/õ‰sā -Ø8ķģ»ØÆVåA–w–Ó)ZćäQ{EB,“uD.j)‘ēķå%ŁĆ~æ)G›‚ž‡"Y«uQ“H8He<^fE0™iuQ -$½^ł’”o#ĶʁĒš…gÅr&oa,lņ+JnČYéŠĮŸJI 2§CÅC¤ĘZł~lą:$Y-Äł¼ÜTļ„†ŽFœŅZÆ~UÓg»ž©yµWmo£Hžī_QEkÓ:•›L§§( TŖß“Či“†Ń:Zl@g›“rå¹i+ÓĒ(ÄCžäų°ĒéS”ÜÓ*MĀˆõ2„“ł»*.:ˆ-£t]µJCHYŁÖåCŅwō24óˆ29Wtcŗ£ ^”e[žņzełSöx—Ķ ×·FsŪpŁŅlīĪĻ$†8¶¼‘mX7ęų aĄ/™Ķ©OŽÄ°ķ£ˆ¢ — Mk m³tĄcĖ5G>#kžFąAŚ:y3sdńƒłÉ"Ć½S” ĖžłŸ9ä°OcćĘøF­CP‡NŅhīš7øsŦ¼łŠó-ī›tķ8cżgŗ­‘é]ķxŠø¹gźpā:ļĆ -XĆ6ž‡sĻbžŲ–5õMםĻ|Ė™@Ā-B¤“ĒŠkgŖ0ƒ,Ē½c»L†J…N·ėHūTµb&Ī`:<8ņŪ’š ->żXšš×¶umNG&ļ:lčÖņĢ*-×ņXĘ*ßšXõę£IÅ~}2>lƒÕēą^š±2pbć4ÕzPąŒIuÜ^7Q>4]ķśKˆ>ÄčˆI¦"zc²ĖWl÷zŖĒ dAžƒš„’­ƒ¦?{=VQӑTļQ¢{pK\Įɗ"ĀDQķż}sÜ%š„–„žó»@’©“k#’/•Ö_B†²u®~Ńģ³Œ<ÅE÷MYüv„5»Š žVX觧”Ų²@²ŠDvqL`ūČ£5w—ŌÆū‹å%vO  KEńøöų dšÜCåÉ`ƒ!uŪt9ņuÄČZźēM˜ÅCė"Y©ūJ&ņq Øfģ Ą µ>§<\~|ߦY²!įė‹0żōž>ĘŲg„aTŽzDKāŲešĘ"HJ¦_‹fŁ˜Ö”Ö T—¤U\~ʓPc9ƕ„'4_łŖ\/ŅYƼe‡o¢tKĖ\iJń M)6XYœ~ŁÕ¦Š·OļŚÅś}"Ŗął„ūÕi.6Ū¦— ā–YȤH©N§¶³|pdbqū­ˆł­Ik%ŗ«ŁŃ>鳊»ó󓳚µĒæe,²_ū‹Åb61\üō;;éӝģ;ūJ"ęū~ć³2ż·•š*Żlq«G:ĀHræÖ‹+Ė6‹|©“,ø>,üŚqŻŪgDšE²<•„ń,•łš¹iŚą¢£‚ūvĢóį²ģ, ܐļ…Ö„A/wµ=]¦fäšīĢV.ßSˆLi»V¾Ś¹^/åøƒcĀl¶@|°ōŽųY ōGL‰my¾ņ?æ§Q²óG‰XJ|¦]¹&ģ¶āäˆÉ”éo¹MģurE \ņlĒØpB“H¢/QØõƒj”ō{:ƒ.ĻMł/*ʵ’ļĻā9Óź, *žA\ˆ½õę¼ępND¼å!)q”3AdēÜB®a°ś‹$ƒ”Q‡”ŖæEØLōó°ž+Q²Næs¢ƒĪ jčŻ@l×A=v5K rŌc"žhā7āžŚ¬«³B„LƒżƒrŖn1œåŚ:ƒLAD¦uE›CTÖ|gõ,‚ÕC•>®ƒē…ķ(ČčtÅ­JŁ]«’ƒ—(… ʉŠJыIī$’@¶óēƒ†ņĆ\BŪ„”Ģķ°×———oyߋ ]…ūś:Z©^ ‰ģė!ŖŠ­_kšN=rŠ)i’˜•†ūŻzģØŌ–Ūå^~÷¾öžµV]Oć8}ēW\!F-(|,Ņ>,ĢĢ’&†Z -I7N`*­„ŅąhŅøJRX“āæļ±ŪŠPŹˆ—ĶCėėsĻ9¾±óõĻłĆ|‡š˜: GĶŸ«üž””~ŗO§''žžüö;ŁU)iP$åOY55}MŠæ˜“ż£L~oģ¢ ƒPS%kY=Źģh5׆„2Ėė¦Ź'‹&W%%eF‹ZR^R­U*ĶČ$/“ź™¦ŖšÕ=åĶ©Źü«EC3•åÓ-?±ŹśÕĶGNŪ²6ģĀ%oŁ}«įxĒœ\")zBŹźļV -ż»c¢pīÖ5ŻČJŸ&ķ ~pā<āx„ZŸĮ)ķ=®B¾‘{Žy'p1™6nŗ(Ss ßĖf…Śß.už|JżZÓ³³5ź·%īfØ~6Ci4Łƒ;Ŗ@՞æ‹×šoB€N½/™|”…šė[åKo[żģ„O2€<żż÷ąĘ³‡,Æśww8 -īī>ˆŁ»ĻÉdŚļ„j6Ó·Žįœōp&ė׈¤ĆƤxJžk4€Ų<Óé÷cŠ<.EŃ³hoŖ~«ō—<4å“XnÜ=łHņV‹5żķ˜/ļFߎ¼ķįsfQ•ųką—Ļ”/§JąŽ-ļßUŅ -¾‡/ĻdB=:ZezS|G“K‡Ż/Qgł%ŠĮ]LfØņ~oÜ[Nž7ŽĶŻwlń÷²óm‘ĻJĆ@ĘļyŠ9ō€ŅŠ¢5]!PjhzDĀ’¤ a7īN‘¾»³¦¦M鰇łĶŸoŲū‡nßEó90Ś֊2q8ēY‘VU‘W5ņ‰ŸÜÓ.›5-^sŽ†‡ĪųČ­ś“™ĀT?ō{Ē„ä±œ•ß½²bsv¹X`<Ū¦%Žę0Ł},ryŠnåé[FYļwČ‘•”ŃŻ&üƒ½X8æü&bŠä|›5ĻöÆ,/hIPśm‘ŻJÄ0…ļós!l Ź>€.Z» -Ŋ­ ˆ”ŠL»ŌdŖˆģ»;µtĄ!C¾9sÉĶķ°Äz w­SŚöI«¤W!ļ­óų  .S÷‰^ö8#žō41Śé|¤9’ėŃņ”‚ŽÅpŹuØ4‰n“-ig”išä„.‹2Łr]“F†Ə®@’t ó%Ų€¹žcŗƒč63Z„SØ¤÷ņ;:©Ų,-’Ŗ*ņŖꞥāyū^Ģ+,«yrĘ}”_āhv CŽ7¼Ē§!<~ŒŚćdwŸTŁ6ęīl|ńŪ‹0˜fz8ć¤j<ö:[®Ī_hu9ķŹ^Óģ©ĪĖGī9Ķ’“Y%~m‘ĮjĆ0 †ļy -vH`£°•­K=”6Ō= Ę&VRƒ±S[ŒŃwŸ½liöćƏ>IæĄŻ±K xŖ­T¦å$ŒNś¢5Öį‹ŅųG1·čD‹ -Ž"££ņž0 z²-šŠE(” ĆpŅ‚±(%¾ÓUlŅVČŹa«<”KjzS“²&½©µš>ƒÆŸr”'AŖ† ‡%˜^ėū‘«Ņ \ųzAŌÕ“pN|¦UUU¾Yq¾)ų!ų Ļ.iēI® -;iLĢ{6Owxź•Ć˜ń¼āl]ģƒ›OĶ3Ī·Éļ]ģ5gå”Ųmƒ‹åž•l»Ž§†óž’%fdņ ]ŽMk„0†ļžŠ9ŒPŗ÷ż ˆ ¬`wƒz(”‚Ķv©f“xXŹž÷NjqÕ÷’—yČ<³}6g9£¹č}§;ńÉ­üRĪKK"Ąœś¶ńŖkÉC£…s üüCœ^50é`mÆõfäźäwž.™ü֊+™ŃĪyV¤UUäU}ʓ»ķ6ó*ÜéGūūP>’„ŻŹKƬ„Ųœ…]ÆVøŸķÓŸž`ł})»=F’Ņ·Œ²:?°CVRF/įf¼“Ćś[˜PH<1!ä|Ÿ5ĻŽÆ,/hIpō m‘ŃJÄ0Eßūó l Ź~€.Z» -Ŋ­ ˆ”ŠL»Ōd*ˆģæ;±“®ā‡KĪĢ½aru=Ęh»…›ĪJe†š„‘ĀI_ Ę:¼SŠ™}G'œw: -ŒŹa@Ld4ÜE(”ēaøiĮX”Š¢~2)k mŪō©©Ź*Ż³ŒĻ:-¼Oą3.O‚Tó%zŲ™“¾üfŖ‡ųģf“ †:™Ī‰x%”8,+Óŗ.‹ŗa½²dv?®Š=hMz™ÅkršäšmRƒēmZēūā‘Õ߉Å÷łQ·aAŚ -Ł:”'tńę÷&6ēĮ.Īņ‡¦ØīYóĖž’€ÜČč uŒA -ƒ@ E÷sŠ\@¼@”BQpg÷Chā8PSĻoŠøžāĆ{’?žė²†¶…ī£T$O†BXi‹Y“ņP¾|Q~éĪ3ŸČĶjfKŁĄƒų3Ķ,nĢ>†HAŌ€©XH) qģĒ8½½Ž<÷Bį³±/Č(PŠ×W(ÉČ,V¢Ä<…ÄŅ’üōŌ¼Ō¢Ä’Ō…“ĢœT]…”|…¼ü…Ō”Ģ®ųųx7OWĻą Čõpō ‰wö÷ ŠihZs1ée¹ˆĄ¾‰$=œ“\; ųD6¬U£¬ŖüXėˆŽ›“kl=Sqy•ēøĶ yŪ}Ģb(ē¶Ń³}ČÆGBMB \ No newline at end of file diff --git a/vendor/phpunit/phpunit/build/binary-phar-autoload.php.in b/vendor/phpunit/phpunit/build/binary-phar-autoload.php.in deleted file mode 100644 index 75cdccbc..00000000 --- a/vendor/phpunit/phpunit/build/binary-phar-autoload.php.in +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env php -')) { - fwrite( - STDERR, - 'This version of PHPUnit requires PHP 5.3.3; using the latest version of PHP is highly recommended.' . PHP_EOL - ); - - die(1); - } - - if (isset($_SERVER['argv'][1]) && $_SERVER['argv'][1] == '--manifest') { - print file_get_contents(__PHPUNIT_PHAR_ROOT__ . '/manifest.txt'); - exit; - } - - PHPUnit_TextUI_Command::main(); -} - -__HALT_COMPILER(); diff --git a/vendor/phpunit/phpunit/build/ca.pem b/vendor/phpunit/phpunit/build/ca.pem deleted file mode 100644 index 20585f1c..00000000 --- a/vendor/phpunit/phpunit/build/ca.pem +++ /dev/null @@ -1,25 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- diff --git a/vendor/phpunit/phpunit/build/library-phar-autoload.php.in b/vendor/phpunit/phpunit/build/library-phar-autoload.php.in deleted file mode 100644 index f919b762..00000000 --- a/vendor/phpunit/phpunit/build/library-phar-autoload.php.in +++ /dev/null @@ -1,9 +0,0 @@ -&1'); - -if (strpos($tag, '-') === false && strpos($tag, 'No names found') === false) { - print $tag; -} else { - $branch = @exec('git rev-parse --abbrev-ref HEAD'); - $hash = @exec('git log -1 --format="%H"'); - print $branch . '@' . $hash; -} - -print "\n"; - -$lock = json_decode(file_get_contents(__DIR__ . '/../composer.lock')); - -foreach ($lock->packages as $package) { - print $package->name . ': ' . $package->version; - - if (!preg_match('/^[v= ]*(([0-9]+)(\\.([0-9]+)(\\.([0-9]+)(-([0-9]+))?(-?([a-zA-Z-+][a-zA-Z0-9\\.\\-:]*)?)?)?)?)$/', $package->version)) { - print '@' . $package->source->reference; - } - - print "\n"; -} diff --git a/vendor/phpunit/phpunit/build/phar-version.php b/vendor/phpunit/phpunit/build/phar-version.php deleted file mode 100755 index 83b8746d..00000000 --- a/vendor/phpunit/phpunit/build/phar-version.php +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env php - - - - - ../tests/Fail - - - - - - - diff --git a/vendor/phpunit/phpunit/composer.json b/vendor/phpunit/phpunit/composer.json index 4a774462..b0535ded 100644 --- a/vendor/phpunit/phpunit/composer.json +++ b/vendor/phpunit/phpunit/composer.json @@ -17,15 +17,14 @@ } ], "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "irc": "irc://irc.freenode.net/phpunit" + "issues": "https://github.com/sebastianbergmann/phpunit/issues" }, "require": { "php": ">=5.3.3", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", "phpunit/php-code-coverage": "~2.1", - "phpunit/php-timer": ">=1.0.6", + "phpunit/php-timer": "^1.0.6", "phpunit/phpunit-mock-objects": "~2.3", "phpspec/prophecy": "^1.3.1", "symfony/yaml": "~2.1|~3.0", diff --git a/vendor/phpunit/phpunit/phpdox.xml.dist b/vendor/phpunit/phpunit/phpdox.xml.dist deleted file mode 100644 index b32db692..00000000 --- a/vendor/phpunit/phpunit/phpdox.xml.dist +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/phpunit/phpunit/phpunit.xml.dist b/vendor/phpunit/phpunit/phpunit.xml similarity index 100% rename from vendor/phpunit/phpunit/phpunit.xml.dist rename to vendor/phpunit/phpunit/phpunit.xml diff --git a/vendor/phpunit/phpunit/phpunit.xsd b/vendor/phpunit/phpunit/phpunit.xsd index d0d70033..7c6d04ff 100644 --- a/vendor/phpunit/phpunit/phpunit.xsd +++ b/vendor/phpunit/phpunit/phpunit.xsd @@ -1,5 +1,5 @@ - + This Schema file defines the rules by which the XML configuration file of PHPUnit 4.8 may be structured. @@ -162,17 +162,19 @@ - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php b/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php index c526c7ba..1903b1bd 100644 --- a/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php +++ b/vendor/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php @@ -73,7 +73,7 @@ protected function matches($other) foreach ($other as $element) { if ($this->checkForObjectIdentity && $element === $this->value) { return true; - } else if (!$this->checkForObjectIdentity && $element == $this->value) { + } elseif (!$this->checkForObjectIdentity && $element == $this->value) { return true; } } @@ -81,7 +81,7 @@ protected function matches($other) foreach ($other as $element) { if ($this->checkForNonObjectIdentity && $element === $this->value) { return true; - } else if (!$this->checkForNonObjectIdentity && $element == $this->value) { + } elseif (!$this->checkForNonObjectIdentity && $element == $this->value) { return true; } } diff --git a/vendor/phpunit/phpunit/src/Framework/TestCase.php b/vendor/phpunit/phpunit/src/Framework/TestCase.php index 0439be57..45e3736b 100644 --- a/vendor/phpunit/phpunit/src/Framework/TestCase.php +++ b/vendor/phpunit/phpunit/src/Framework/TestCase.php @@ -1324,6 +1324,7 @@ protected function setLocale() * @param bool $callAutoload Can be used to disable __autoload() during the generation of the test double class. * @param bool $cloneArguments * @param bool $callOriginalMethods + * @param object $proxyTarget * * @return PHPUnit_Framework_MockObject_MockObject * @@ -1331,7 +1332,7 @@ protected function setLocale() * * @since Method available since Release 3.0.0 */ - public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false) + public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false, $proxyTarget = null) { $mockObject = $this->getMockObjectGenerator()->getMock( $originalClassName, @@ -1342,7 +1343,8 @@ public function getMock($originalClassName, $methods = array(), array $arguments $callOriginalClone, $callAutoload, $cloneArguments, - $callOriginalMethods + $callOriginalMethods, + $proxyTarget ); $this->mockObjects[] = $mockObject; diff --git a/vendor/phpunit/phpunit/src/Runner/Version.php b/vendor/phpunit/phpunit/src/Runner/Version.php index d7805ab2..19b51558 100644 --- a/vendor/phpunit/phpunit/src/Runner/Version.php +++ b/vendor/phpunit/phpunit/src/Runner/Version.php @@ -30,7 +30,7 @@ public static function id() } if (self::$version === null) { - $version = new SebastianBergmann\Version('4.8.24', dirname(dirname(__DIR__))); + $version = new SebastianBergmann\Version('4.8.27', dirname(dirname(__DIR__))); self::$version = $version->getVersion(); } @@ -45,12 +45,13 @@ public static function id() public static function series() { if (strpos(self::id(), '-')) { - $tmp = explode('-', self::id()); - - return $tmp[0]; + $tmp = explode('-', self::id()); + $version = $tmp[0]; + } else { + $version = self::id(); } - return implode('.', array_slice(explode('.', self::id()), 0, 2)); + return implode('.', array_slice(explode('.', $version), 0, 2)); } /** @@ -68,12 +69,8 @@ public static function getVersionString() */ public static function getReleaseChannel() { - if (strpos(self::$pharVersion, 'alpha') !== false) { - return '-alpha'; - } - - if (strpos(self::$pharVersion, 'beta') !== false) { - return '-beta'; + if (strpos(self::$pharVersion, '-') !== false) { + return '-nightly'; } return ''; diff --git a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php index 71648612..bb07ea7e 100644 --- a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php +++ b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php @@ -597,7 +597,7 @@ protected function runFailed($message) */ protected function write($buffer) { - if (PHP_SAPI != 'cli') { + if (PHP_SAPI != 'cli' && PHP_SAPI != 'phpdbg') { $buffer = htmlspecialchars($buffer); } diff --git a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl.dist b/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl.dist index 8ff855c9..c1d14ddc 100644 --- a/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl.dist +++ b/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl.dist @@ -78,10 +78,19 @@ if ('' !== $configurationFilePath) { unset($configuration); } +function __phpunit_error_handler($errno, $errstr, $errfile, $errline, $errcontext) +{ + return true; +} + +set_error_handler("__phpunit_error_handler"); + {constants} {included_files} {globals} +restore_error_handler(); + if (isset($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { require_once $GLOBALS['__PHPUNIT_BOOTSTRAP']; unset($GLOBALS['__PHPUNIT_BOOTSTRAP']); diff --git a/vendor/phpunit/phpunit/src/Util/Printer.php b/vendor/phpunit/phpunit/src/Util/Printer.php index 9ff7daac..d2ab41eb 100644 --- a/vendor/phpunit/phpunit/src/Util/Printer.php +++ b/vendor/phpunit/phpunit/src/Util/Printer.php @@ -127,7 +127,7 @@ public function write($buffer) $this->incrementalFlush(); } } else { - if (PHP_SAPI != 'cli') { + if (PHP_SAPI != 'cli' && PHP_SAPI != 'phpdbg') { $buffer = htmlspecialchars($buffer); } diff --git a/vendor/phpunit/phpunit/src/Util/Test.php b/vendor/phpunit/phpunit/src/Util/Test.php index cef33b37..db8d0094 100644 --- a/vendor/phpunit/phpunit/src/Util/Test.php +++ b/vendor/phpunit/phpunit/src/Util/Test.php @@ -467,12 +467,24 @@ public static function getDataFromTestWithAnnotation($docComment) $offset = strlen($matches[0][0]) + $matches[0][1]; $annotationContent = substr($docComment, $offset); $data = array(); + foreach (explode("\n", $annotationContent) as $candidateRow) { $candidateRow = trim($candidateRow); - $dataSet = json_decode($candidateRow, true); - if (json_last_error() != JSON_ERROR_NONE) { + + if ($candidateRow[0] !== '[') { break; } + + $dataSet = json_decode($candidateRow, true); + + if (json_last_error() != JSON_ERROR_NONE) { + $error = function_exists('json_last_error_msg') ? json_last_error_msg() : json_last_error(); + + throw new PHPUnit_Framework_Exception( + 'The dataset for the @testWith annotation cannot be parsed: ' . $error + ); + } + $data[] = $dataSet; } diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1149.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1149.phpt index 45e24358..c4111908 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1149.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1149.phpt @@ -15,6 +15,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .1.2 -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1216.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1216.phpt index d13403b4..631bb2a1 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1216.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1216.phpt @@ -20,6 +20,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'Issue1216Test::testConfigAvailableInBootstrap'. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1265.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1265.phpt index a179d5d4..1b3159c3 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1265.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1265.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1330.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1330.phpt index c31073ec..48dab3c2 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1330.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1330.phpt @@ -19,6 +19,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'Issue1330Test::testTrue'. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1335.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1335.phpt index cd6aade1..1ed52031 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1335.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1335.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ............ -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (12 tests, 12 assertions) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1337.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1337.phpt index 9c1d76f2..3c7077e4 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1337.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1337.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) \ No newline at end of file diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1348.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1348.phpt index 3cf3d516..a3a721d7 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1348.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1348.phpt @@ -25,7 +25,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. STDOUT does not break test result E -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 error: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1351.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1351.phpt index 2dbc2af7..c13c4220 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1351.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1351.phpt @@ -22,7 +22,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F.E.E -Time: %s, Memory: %sMb +Time: %s, Memory: %s There were 2 errors: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1374.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1374.phpt index 84d13be2..473e01ff 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1374.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1374.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. S -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Skipped: 1. diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1437.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1437.phpt index f9bd41bf..b7064c58 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1437.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1437.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1468.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1468.phpt index 23c410b1..7b46ca97 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1468.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1468.phpt @@ -16,7 +16,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. I -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1. diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1471.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1471.phpt index 631d6e6d..20886823 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1471.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1471.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1472.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1472.phpt index 3e605b40..0958eb35 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1472.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1472.phpt @@ -21,6 +21,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 4 assertions) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/1570.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/1570.phpt index a94b961a..553c6448 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/1570.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/1570.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. R* -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Risky: 1. diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2158.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/2158.phpt new file mode 100644 index 00000000..2866ab98 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2158.phpt @@ -0,0 +1,19 @@ +--TEST-- +#2158: Failure to run tests in separate processes if a file included into main process contains constant definition +--FILE-- + +--EXPECTF-- +PHPUnit %s by Sebastian Bergmann and contributors. + +%s + +Time: %s, Memory: %s + +OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2158/Issue2158Test.php b/vendor/phpunit/phpunit/tests/Regression/GitHub/2158/Issue2158Test.php new file mode 100644 index 00000000..014aa4f6 --- /dev/null +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2158/Issue2158Test.php @@ -0,0 +1,23 @@ +assertTrue(true); + } + + /** + * Constant defined previously in main process constant should be available and + * no errors should be yielded by reload of included files + * + * @runInSeparateProcess + */ + public function testSomethingElse() + { + $this->assertTrue(defined('TEST_CONSTANT')); + } +} diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2158/constant.inc b/vendor/phpunit/phpunit/tests/Regression/GitHub/2158/constant.inc new file mode 100644 index 00000000..4137114f --- /dev/null +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2158/constant.inc @@ -0,0 +1,5 @@ + diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/244.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/244.phpt index 3cb9aefe..b517e5c0 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/244.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/244.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. .FFF -Time: %s, Memory: %sMb +Time: %s, Memory: %s There were 3 failures: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/322.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/322.phpt index 0d892c72..0974a706 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/322.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/322.phpt @@ -21,6 +21,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. Starting test 'Issue322Test::testOne'. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 0 assertions) diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/433.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/433.phpt index ead9437c..df6c6f8e 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/433.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/433.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. ..F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/445.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/445.phpt index e57e7fbf..c0183f9e 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/445.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/445.phpt @@ -16,7 +16,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. ..F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/498.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/498.phpt index 51dbe759..4f8508e1 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/498.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/498.phpt @@ -17,7 +17,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/503.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/503.phpt index 2e7b30f3..c9dbd564 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/503.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/503.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/581.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/581.phpt index c2d65459..96ad88a9 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/581.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/581.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/74.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/74.phpt index 8a4f79dc..2f54d268 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/74.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/74.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. E -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 error: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/765.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/765.phpt index dc59dd6b..637ad9d1 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/765.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/765.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. .F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/797.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/797.phpt index 4a6490f0..8be21eb6 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/797.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/797.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) \ No newline at end of file diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/863.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/863.phpt index 1e0ffbda..cbac4fe6 100644 --- a/vendor/phpunit/phpunit/tests/Regression/GitHub/863.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/863.phpt @@ -19,6 +19,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ............................................................... 126 / 150 ( 84%) ........................ -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (150 tests, 150 assertions) diff --git a/vendor/phpunit/phpunit/tests/Regression/Trac/1021.phpt b/vendor/phpunit/phpunit/tests/Regression/Trac/1021.phpt index 381906cf..2bf6ca11 100644 --- a/vendor/phpunit/phpunit/tests/Regression/Trac/1021.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/Trac/1021.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/Regression/Trac/523.phpt b/vendor/phpunit/phpunit/tests/Regression/Trac/523.phpt index 6d5679f9..c182a987 100644 --- a/vendor/phpunit/phpunit/tests/Regression/Trac/523.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/Trac/523.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/Regression/Trac/578.phpt b/vendor/phpunit/phpunit/tests/Regression/Trac/578.phpt index 1b710f2d..27ea9f1f 100644 --- a/vendor/phpunit/phpunit/tests/Regression/Trac/578.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/Trac/578.phpt @@ -14,7 +14,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. EEE -Time: %s, Memory: %sMb +Time: %s, Memory: %s There were 3 errors: diff --git a/vendor/phpunit/phpunit/tests/Regression/Trac/684.phpt b/vendor/phpunit/phpunit/tests/Regression/Trac/684.phpt index 3cdb949f..da51508d 100644 --- a/vendor/phpunit/phpunit/tests/Regression/Trac/684.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/Trac/684.phpt @@ -14,7 +14,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/Regression/Trac/783.phpt b/vendor/phpunit/phpunit/tests/Regression/Trac/783.phpt index 8f405dab..73e5784d 100644 --- a/vendor/phpunit/phpunit/tests/Regression/Trac/783.phpt +++ b/vendor/phpunit/phpunit/tests/Regression/Trac/783.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 0 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/abstract-test-class.phpt b/vendor/phpunit/phpunit/tests/TextUI/abstract-test-class.phpt index 8d6c07a3..e26a80c7 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/abstract-test-class.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/abstract-test-class.phpt @@ -14,7 +14,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/TextUI/colors-always.phpt b/vendor/phpunit/phpunit/tests/TextUI/colors-always.phpt index 28b527d6..0e0ac1ed 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/colors-always.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/colors-always.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s %s[30;42mOK (3 tests, 3 assertions)%s[0m diff --git a/vendor/phpunit/phpunit/tests/TextUI/concrete-test-class.phpt b/vendor/phpunit/phpunit/tests/TextUI/concrete-test-class.phpt index f01bd799..445c01c4 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/concrete-test-class.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/concrete-test-class.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 0 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/custom-printer-debug.phpt b/vendor/phpunit/phpunit/tests/TextUI/custom-printer-debug.phpt index 19b9e059..81e4ae06 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/custom-printer-debug.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/custom-printer-debug.phpt @@ -22,6 +22,6 @@ Starting test 'BankAccountTest::testBalanceCannotBecomeNegative'. Starting test 'BankAccountTest::testBalanceCannotBecomeNegative2'. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/custom-printer-verbose.phpt b/vendor/phpunit/phpunit/tests/TextUI/custom-printer-verbose.phpt index 2e2a9909..2255a6ee 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/custom-printer-verbose.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/custom-printer-verbose.phpt @@ -19,7 +19,7 @@ Configuration: %sconfiguration.custom-printer.xml I -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 incomplete test: diff --git a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-debug.phpt b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-debug.phpt index e7e49b4e..e95136f2 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-debug.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-debug.phpt @@ -29,6 +29,6 @@ Starting test 'DataProviderDebugTest::testProvider with data set #5 (Binary Stri Starting test 'DataProviderDebugTest::testProvider with data set #6 (Binary String: 0x0009)'. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (7 tests, 7 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml-isolation.phpt index e1c4571d..0e70df80 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml-isolation.phpt @@ -34,7 +34,7 @@ Failed asserting that 2 matches expected 3. -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml.phpt b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml.phpt index a14b4664..f6ca5d16 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-log-xml.phpt @@ -33,7 +33,7 @@ Failed asserting that 2 matches expected 3. -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/TextUI/debug.phpt b/vendor/phpunit/phpunit/tests/TextUI/debug.phpt index 1639484c..0829197c 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/debug.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/debug.phpt @@ -21,6 +21,6 @@ Starting test 'BankAccountTest::testBalanceCannotBecomeNegative'. Starting test 'BankAccountTest::testBalanceCannotBecomeNegative2'. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/default-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/default-isolation.phpt index 864484c8..cca8bc81 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/default-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/default-isolation.phpt @@ -15,6 +15,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/default.phpt b/vendor/phpunit/phpunit/tests/TextUI/default.phpt index 9fefe1a1..bd7615b2 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/default.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/default.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/dependencies-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/dependencies-isolation.phpt index 226d3d83..6d2a5b35 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dependencies-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dependencies-isolation.phpt @@ -18,7 +18,7 @@ Runtime: %s ...FSS -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/TextUI/dependencies.phpt b/vendor/phpunit/phpunit/tests/TextUI/dependencies.phpt index 593088f9..f32d10a5 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dependencies.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dependencies.phpt @@ -17,7 +17,7 @@ Runtime: %s ...FSS -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/TextUI/dependencies2-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/dependencies2-isolation.phpt index bd88351a..5e7ef8fe 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dependencies2-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dependencies2-isolation.phpt @@ -15,6 +15,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 5 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/dependencies2.phpt b/vendor/phpunit/phpunit/tests/TextUI/dependencies2.phpt index d05b79d8..a30dd4e2 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dependencies2.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dependencies2.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 5 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/dependencies3-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/dependencies3-isolation.phpt index 37d2e639..51d448c2 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dependencies3-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dependencies3-isolation.phpt @@ -15,6 +15,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/dependencies3.phpt b/vendor/phpunit/phpunit/tests/TextUI/dependencies3.phpt index 6c5d3b1c..218620d6 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/dependencies3.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/dependencies3.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/empty-testcase.phpt b/vendor/phpunit/phpunit/tests/TextUI/empty-testcase.phpt index 3de7055a..0d0eccb5 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/empty-testcase.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/empty-testcase.phpt @@ -14,7 +14,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. F -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 failure: diff --git a/vendor/phpunit/phpunit/tests/TextUI/exception-stack.phpt b/vendor/phpunit/phpunit/tests/TextUI/exception-stack.phpt index db585bf0..823ef1bd 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/exception-stack.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/exception-stack.phpt @@ -14,7 +14,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. EE -Time: %s, Memory: %sMb +Time: %s, Memory: %s There were 2 errors: diff --git a/vendor/phpunit/phpunit/tests/TextUI/exclude-group-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/exclude-group-isolation.phpt index 736feda8..b9afb6b7 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/exclude-group-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/exclude-group-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/exclude-group.phpt b/vendor/phpunit/phpunit/tests/TextUI/exclude-group.phpt index f75d6115..dcbc5d3d 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/exclude-group.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/exclude-group.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/failure-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/failure-isolation.phpt index 7df4f101..a0c9906a 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/failure-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/failure-isolation.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. FFFFFFFFFFFFF -Time: %s, Memory: %sMb +Time: %s, Memory: %s There were 13 failures: diff --git a/vendor/phpunit/phpunit/tests/TextUI/failure.phpt b/vendor/phpunit/phpunit/tests/TextUI/failure.phpt index 23415e94..30ce3031 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/failure.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/failure.phpt @@ -14,7 +14,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. FFFFFFFFFFFFF -Time: %s, Memory: %sMb +Time: %s, Memory: %s There were 13 failures: diff --git a/vendor/phpunit/phpunit/tests/TextUI/fatal-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/fatal-isolation.phpt index ec7f91a9..95e3f113 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/fatal-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/fatal-isolation.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. E -Time: %s, Memory: %sMb +Time: %s, Memory: %s There was 1 error: diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-class-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-class-isolation.phpt index 31cf060d..acb2e5d7 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-class-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-class-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-class.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-class.phpt index 7b3c8dd8..97c94da1 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-class.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-class.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range-isolation.phpt index f90a6917..630a48a7 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range.phpt index 9c1e6897..2314eb85 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-classname-and-range.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number-isolation.phpt index 0d2ea778..3ff675e4 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number.phpt index 79bf6430..bc7beda4 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-number.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range-isolation.phpt index 2dfdd0c8..6aa25676 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range.phpt index c3d344cd..b3b681c4 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-range.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp-isolation.phpt index d109cfb3..db1516bb 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp.phpt index d87b3045..27db60b3 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-regexp.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string-isolation.phpt index 07c4002d..fca15519 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string.phpt index 0cf91eb7..00a32d7a 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-only-string.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range-isolation.phpt index 2231b4d1..22bacbbe 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range.phpt index 2f2aa1d7..2a6a5570 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-range.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp-isolation.phpt index 3a46c510..8126802c 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp.phpt index fdbd8bd3..17ad7183 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-regexp.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. .. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (2 tests, 2 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string-isolation.phpt index d91ca73f..db34b62b 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string.phpt index eb3e6afd..79878e9b 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-dataprovider-by-string.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-insensitive.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-insensitive.phpt index 55519a1c..4f510421 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-insensitive.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-insensitive.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-sensitive-no-result.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-sensitive-no-result.phpt index 0551054d..454d116d 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-sensitive-no-result.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-method-case-sensitive-no-result.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. -Time: %s, Memory: %sMb +Time: %s, Memory: %s No tests executed! diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-method-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-method-isolation.phpt index 9cd16eff..c9fa6e54 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-method-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-method-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-method.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-method.phpt index 9f5b01cb..95fd598a 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-method.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-method.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/filter-no-results.phpt b/vendor/phpunit/phpunit/tests/TextUI/filter-no-results.phpt index a2720c86..bb1e6d37 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/filter-no-results.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/filter-no-results.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. -Time: %s, Memory: %sMb +Time: %s, Memory: %s No tests executed! diff --git a/vendor/phpunit/phpunit/tests/TextUI/group-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/group-isolation.phpt index 9fc0d02d..7e74c6f9 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/group-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/group-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/group.phpt b/vendor/phpunit/phpunit/tests/TextUI/group.phpt index 858456bd..be123934 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/group.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/group.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/ini-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/ini-isolation.phpt index ee002df5..76b88ac1 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/ini-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/ini-isolation.phpt @@ -17,6 +17,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/log-json-no-pretty-print.phpt b/vendor/phpunit/phpunit/tests/TextUI/log-json-no-pretty-print.phpt index b2b4ae87..33ed4ed4 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/log-json-no-pretty-print.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/log-json-no-pretty-print.phpt @@ -22,6 +22,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. {"event":"suiteStart","suite":"BankAccountTest","tests":3}{"event":"testStart","suite":"BankAccountTest","test":"BankAccountTest::testBalanceIsInitiallyZero"}.{"event":"test","suite":"BankAccountTest","test":"BankAccountTest::testBalanceIsInitiallyZero","status":"pass","time":%f,"trace":[],"message":"","output":""}{"event":"testStart","suite":"BankAccountTest","test":"BankAccountTest::testBalanceCannotBecomeNegative"}.{"event":"test","suite":"BankAccountTest","test":"BankAccountTest::testBalanceCannotBecomeNegative","status":"pass","time":%f,"trace":[],"message":"","output":""}{"event":"testStart","suite":"BankAccountTest","test":"BankAccountTest::testBalanceCannotBecomeNegative2"}.{"event":"test","suite":"BankAccountTest","test":"BankAccountTest::testBalanceCannotBecomeNegative2","status":"pass","time":%f,"trace":[],"message":"","output":""} -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/log-json-post-66021.phpt b/vendor/phpunit/phpunit/tests/TextUI/log-json-post-66021.phpt index deb03a43..b045617c 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/log-json-post-66021.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/log-json-post-66021.phpt @@ -67,6 +67,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. "output": "" } -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/log-json-pre-66021.phpt b/vendor/phpunit/phpunit/tests/TextUI/log-json-pre-66021.phpt index a2fb751b..1b2b37c0 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/log-json-pre-66021.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/log-json-pre-66021.phpt @@ -73,6 +73,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. "output": "" } -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/log-tap.phpt b/vendor/phpunit/phpunit/tests/TextUI/log-tap.phpt index 6e13626b..e9221ee4 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/log-tap.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/log-tap.phpt @@ -21,6 +21,6 @@ TAP version 13 1..3 -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/log-xml.phpt b/vendor/phpunit/phpunit/tests/TextUI/log-xml.phpt index a031c85b..a1c65709 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/log-xml.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/log-xml.phpt @@ -24,6 +24,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/options-after-arguments.phpt b/vendor/phpunit/phpunit/tests/TextUI/options-after-arguments.phpt index d4cdc1af..e7f2cec8 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/options-after-arguments.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/options-after-arguments.phpt @@ -14,6 +14,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s %s[30;42mOK (3 tests, 3 assertions)%s[0m diff --git a/vendor/phpunit/phpunit/tests/TextUI/output-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/output-isolation.phpt index 128a7e26..5226b257 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/output-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/output-isolation.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. . -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (1 test, 1 assertion) diff --git a/vendor/phpunit/phpunit/tests/TextUI/repeat.phpt b/vendor/phpunit/phpunit/tests/TextUI/repeat.phpt index db5eddb2..8be67ea4 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/repeat.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/repeat.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ......... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (9 tests, 9 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-incomplete.phpt b/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-incomplete.phpt index 9bc4c2dc..04239246 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-incomplete.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-incomplete.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. I -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Incomplete: 1. diff --git a/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-isolation.phpt b/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-isolation.phpt index 9401b269..ff6a0d1e 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-isolation.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests-isolation.phpt @@ -16,7 +16,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. R -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Risky: 1. diff --git a/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests.phpt b/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests.phpt index 9eb22dfc..f9812782 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/report-useless-tests.phpt @@ -15,7 +15,7 @@ PHPUnit %s by Sebastian Bergmann and contributors. R -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 0, Risky: 1. diff --git a/vendor/phpunit/phpunit/tests/TextUI/test-suffix-multiple.phpt b/vendor/phpunit/phpunit/tests/TextUI/test-suffix-multiple.phpt index 417f0658..6509b68f 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/test-suffix-multiple.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/test-suffix-multiple.phpt @@ -15,6 +15,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ..... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (5 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/test-suffix-single.phpt b/vendor/phpunit/phpunit/tests/TextUI/test-suffix-single.phpt index 6c359371..137a3e51 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/test-suffix-single.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/test-suffix-single.phpt @@ -15,6 +15,6 @@ PHPUnit %s by Sebastian Bergmann and contributors. ... -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/testdox-html.phpt b/vendor/phpunit/phpunit/tests/TextUI/testdox-html.phpt index 95e44057..c5ebeef2 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/testdox-html.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/testdox-html.phpt @@ -16,6 +16,6 @@ PHPUnit %s by Sebastian Bergmann and contributors.

    BankAccount

      ...
    • Balance is initially zero
    • Balance cannot become negative
    -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/TextUI/testdox-text.phpt b/vendor/phpunit/phpunit/tests/TextUI/testdox-text.phpt index 79c67553..bb36acfb 100644 --- a/vendor/phpunit/phpunit/tests/TextUI/testdox-text.phpt +++ b/vendor/phpunit/phpunit/tests/TextUI/testdox-text.phpt @@ -20,6 +20,6 @@ BankAccount -Time: %s, Memory: %sMb +Time: %s, Memory: %s OK (3 tests, 3 assertions) diff --git a/vendor/phpunit/phpunit/tests/Util/TestTest.php b/vendor/phpunit/phpunit/tests/Util/TestTest.php index 2ec3829b..2b425364 100644 --- a/vendor/phpunit/phpunit/tests/Util/TestTest.php +++ b/vendor/phpunit/phpunit/tests/Util/TestTest.php @@ -346,13 +346,25 @@ public function testTestWithThrowsProperExceptionIfDatasetCannotBeParsed() { $this->setExpectedExceptionRegExp( 'PHPUnit_Framework_Exception', - '/^The dataset for the @testWith annotation cannot be parsed.$/' + '/^The dataset for the @testWith annotation cannot be parsed:/' ); PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** * @testWith [s] */'); } + public function testTestWithThrowsProperExceptionIfMultiLineDatasetCannotBeParsed() + { + $this->setExpectedExceptionRegExp( + 'PHPUnit_Framework_Exception', + '/^The dataset for the @testWith annotation cannot be parsed:/' + ); + PHPUnit_Util_Test::getDataFromTestWithAnnotation('/** + * @testWith ["valid"] + * [invalid] + */'); + } + /** * @covers PHPUnit_Util_Test::getDependencies * diff --git a/vendor/react/promise/.gitignore b/vendor/react/promise/.gitignore index c4bcb78f..5241c60a 100644 --- a/vendor/react/promise/.gitignore +++ b/vendor/react/promise/.gitignore @@ -1,4 +1,5 @@ composer.lock composer.phar phpunit.xml +build/ vendor/ diff --git a/vendor/react/promise/.travis.yml b/vendor/react/promise/.travis.yml index 7e7f351f..19c08ab1 100644 --- a/vendor/react/promise/.travis.yml +++ b/vendor/react/promise/.travis.yml @@ -5,13 +5,18 @@ php: - 5.5 - 5.6 - 7.0 + - nightly - hhvm before_install: - composer self-update install: - - composer install --prefer-source + - composer install script: - - phpunit -v --coverage-text + - phpunit -v --coverage-text --coverage-clover=./build/logs/clover.xml + +after_script: + - if [ -f ./build/logs/clover.xml ]; then travis_retry composer require satooshi/php-coveralls --no-interaction --update-with-dependencies; fi + - if [ -f ./build/logs/clover.xml ]; then php vendor/bin/coveralls -v; fi diff --git a/vendor/react/promise/CHANGELOG.md b/vendor/react/promise/CHANGELOG.md index 28d279c0..4b1d59d0 100644 --- a/vendor/react/promise/CHANGELOG.md +++ b/vendor/react/promise/CHANGELOG.md @@ -1,69 +1,93 @@ CHANGELOG ========= +* 2.4.1 (2016-05-03) + + * Fix `some()` not cancelling pending promises when too much input promises + reject (16ff799). + +* 2.4.0 (2016-03-31) + + * Support foreign thenables in `resolve()`. + Any object that provides a `then()` method is now assimilated to a trusted + promise that follows the state of this thenable (#52). + * Fix `some()` and `any()` for input arrays containing not enough items + (#34). + +* 2.3.0 (2016-03-24) + + * Allow cancellation of promises returned by functions working on promise + collections (#36). + * Handle `\Throwable` in the same way as `\Exception` (#51 by @joshdifabio). + * 2.2.2 (2016-02-26) - * Fix cancellation handlers called multiple times (#47 by @clue). + * Fix cancellation handlers called multiple times (#47 by @clue). * 2.2.1 (2015-07-03) - * Fix stack error when resolving a promise in its own fulfillment or rejection - handlers. + * Fix stack error when resolving a promise in its own fulfillment or + rejection handlers. * 2.2.0 (2014-12-30) - * Introduce new ExtendedPromiseInterface implemented by all promises - * Add new .done() method (part of the ExtendedPromiseInterface) - * Add new .otherwise() method (part of the ExtendedPromiseInterface) - * Add new .always() method (part of the ExtendedPromiseInterface) - * Add new .progress() method (part of the ExtendedPromiseInterface) - * Rename Deferred::progress to Deferred::notify to avoid confusion with - ExtendedPromiseInterface::progress (a Deferred::progress alias is still - available for backward compatibility) - * resolve() now always returns a ExtendedPromiseInterface + * Introduce new `ExtendedPromiseInterface` implemented by all promises. + * Add new `done()` method (part of the `ExtendedPromiseInterface`). + * Add new `otherwise()` method (part of the `ExtendedPromiseInterface`). + * Add new `always()` method (part of the `ExtendedPromiseInterface`). + * Add new `progress()` method (part of the `ExtendedPromiseInterface`). + * Rename `Deferred::progress` to `Deferred::notify` to avoid confusion with + `ExtendedPromiseInterface::progress` (a `Deferred::progress` alias is + still available for backward compatibility) + * `resolve()` now always returns a `ExtendedPromiseInterface`. * 2.1.0 (2014-10-15) - * Introduce new CancellablePromiseInterface implemented by all promises - * Add new .cancel() method (part of the CancellablePromiseInterface) + * Introduce new `CancellablePromiseInterface` implemented by all promises. + * Add new `cancel()` method (part of the `CancellablePromiseInterface`). * 2.0.0 (2013-12-10) - New major release. The goal was to streamline the API and to make it more - compliant with other promise libraries and especially with the new upcoming - [ES6 promises specification](https://github.com/domenic/promises-unwrapping/). - - * Add standalone Promise class. - * Add new React\Promise\race() function. - * BC break: Bump minimum PHP version to PHP 5.4. - * BC break: Remove ResolverInterface and PromiseInterface from Deferred. - * BC break: Change signature of PromiseInterface. - * BC break: Remove When and Util classes and move static methods to functions. - * BC break: FulfilledPromise and RejectedPromise now throw an exception when - initialized with a promise instead of a value/reason. - * BC break: React\Promise\Deferred::resolve() and React\Promise\Deferred::reject() - no longer return a promise. + New major release. The goal is to streamline the API and to make it more + compliant with other promise libraries and especially with the new upcoming + [ES6 promises specification](https://github.com/domenic/promises-unwrapping/). + + * Add standalone Promise class. + * Add new `race()` function. + * BC break: Bump minimum PHP version to PHP 5.4. + * BC break: Remove `ResolverInterface` and `PromiseInterface` from + `Deferred`. + * BC break: Change signature of `PromiseInterface`. + * BC break: Remove `When` and `Util` classes and move static methods to + functions. + * BC break: `FulfilledPromise` and `RejectedPromise` now throw an exception + when initialized with a promise instead of a value/reason. + * BC break: `Deferred::resolve()` and `Deferred::reject()` no longer return + a promise. * 1.0.4 (2013-04-03) - * Trigger PHP errors when invalid callback is passed. - * Fully resolve rejection value before calling rejection handler. - * Add When::lazy() to create lazy promises which will be initialized once a - consumer calls the then() method. + * Trigger PHP errors when invalid callback is passed. + * Fully resolve rejection value before calling rejection handler. + * Add `When::lazy()` to create lazy promises which will be initialized once + a consumer calls the `then()` method. * 1.0.3 (2012-11-17) - * Add `PromisorInterface` for objects that have a `promise()` method. + * Add `PromisorInterface` for objects that have a `promise()` method. * 1.0.2 (2012-11-14) - * Fix bug in When::any() not correctly unwrapping to a single result value - * $promiseOrValue argument of When::resolve() and When::reject() is now optional + * Fix bug in `When::any()` not correctly unwrapping to a single result + value. + * `$promiseOrValue` argument of `When::resolve()` and When::reject() is now + optional. * 1.0.1 (2012-11-13) - * Prevent deep recursion which was reaching `xdebug.max_nesting_level` default of 100 + * Prevent deep recursion which was reaching `xdebug.max_nesting_level` + default of 100. * 1.0.0 (2012-11-07) - * First tagged release + * First tagged release. diff --git a/vendor/react/promise/README.md b/vendor/react/promise/README.md index d177e047..9c0558c0 100644 --- a/vendor/react/promise/README.md +++ b/vendor/react/promise/README.md @@ -5,6 +5,7 @@ A lightweight implementation of [CommonJS Promises/A](http://wiki.commonjs.org/wiki/Promises/A) for PHP. [![Build Status](https://travis-ci.org/reactphp/promise.svg?branch=master)](http://travis-ci.org/reactphp/promise) +[![Coverage Status](https://coveralls.io/repos/github/reactphp/promise/badge.svg?branch=master)](https://coveralls.io/github/reactphp/promise?branch=master) Table of Contents ----------------- @@ -446,6 +447,11 @@ $promise->then(function ($value) { Useful functions for creating, joining, mapping and reducing collections of promises. +All functions working on promise collections (like `all()`, `race()`, `some()` +etc.) support cancellation. This means, if you call `cancel()` on the returned +promise, all promises in the collection are cancelled. If the collection itself +is a promise which resolves to an array, this promise is also cancelled. + #### resolve() ```php @@ -457,7 +463,10 @@ Creates a promise for the supplied `$promiseOrValue`. If `$promiseOrValue` is a value, it will be the resolution value of the returned promise. -If `$promiseOrValue` is a promise, it will simply be returned. +If `$promiseOrValue` is a thenable (any object that provides a `then()` method), +a trusted promise that follows the state of the thenable is returned. + +If `$promiseOrValue` is a promise, it will be returned as is. Note: The promise returned is always a promise implementing [ExtendedPromiseInterface](#extendedpromiseinterface). If you pass in a custom @@ -515,6 +524,9 @@ will be the resolution value of the triggering item. The returned promise will only reject if *all* items in `$promisesOrValues` are rejected. The rejection value will be an array of all rejection reasons. +The returned promise will also reject with a `React\Promise\Exception\LengthException` +if `$promisesOrValues` contains 0 items. + #### some() ```php @@ -531,6 +543,9 @@ to resolve (that is, when `(count($promisesOrValues) - $howMany) + 1` items reject). The rejection value will be an array of `(count($promisesOrValues) - $howMany) + 1` rejection reasons. +The returned promise will also reject with a `React\Promise\Exception\LengthException` +if `$promisesOrValues` contains less items than `$howMany`. + #### map() ```php @@ -660,16 +675,18 @@ $deferred->promise() ->then(function ($x) { throw new \Exception($x + 1); }) - ->then(null, function (\Exception $x) { + ->otherwise(function (\Exception $x) { // Propagate the rejection throw $x; }) - ->then(null, function (\Exception $x) { + ->otherwise(function (\Exception $x) { // Can also propagate by returning another rejection - return React\Promise\reject((integer) $x->getMessage() + 1); + return React\Promise\reject( + new \Exception($x->getMessage() + 1) + ); }) - ->then(null, function ($x) { - echo 'Reject ' . $x; // 3 + ->otherwise(function ($x) { + echo 'Reject ' . $x->getMessage(); // 3 }); $deferred->resolve(1); // Prints "Reject 3" @@ -688,12 +705,12 @@ $deferred->promise() return $x + 1; }) ->then(function ($x) { - throw \Exception($x + 1); + throw new \Exception($x + 1); }) - ->then(null, function (\Exception $x) { + ->otherwise(function (\Exception $x) { // Handle the rejection, and don't propagate. // This is like catch without a rethrow - return (integer) $x->getMessage() + 1; + return $x->getMessage() + 1; }) ->then(function ($x) { echo 'Mixed ' . $x; // 4 diff --git a/vendor/react/promise/composer.json b/vendor/react/promise/composer.json index b90b7c30..22dae5a2 100644 --- a/vendor/react/promise/composer.json +++ b/vendor/react/promise/composer.json @@ -14,6 +14,11 @@ }, "files": ["src/functions_include.php"] }, + "autoload-dev": { + "psr-4": { + "React\\Promise\\": "tests/fixtures" + } + }, "extra": { "branch-alias": { "dev-master": "2.0-dev" diff --git a/vendor/react/promise/phpunit.xml.dist b/vendor/react/promise/phpunit.xml.dist index 0200d463..b9a689d7 100644 --- a/vendor/react/promise/phpunit.xml.dist +++ b/vendor/react/promise/phpunit.xml.dist @@ -20,6 +20,9 @@ ./src/ + + ./src/functions_include.php +
    diff --git a/vendor/react/promise/src/CancellationQueue.php b/vendor/react/promise/src/CancellationQueue.php new file mode 100644 index 00000000..a366994d --- /dev/null +++ b/vendor/react/promise/src/CancellationQueue.php @@ -0,0 +1,55 @@ +started) { + return; + } + + $this->started = true; + $this->drain(); + } + + public function enqueue($cancellable) + { + if (!method_exists($cancellable, 'then') || !method_exists($cancellable, 'cancel')) { + return; + } + + $length = array_push($this->queue, $cancellable); + + if ($this->started && 1 === $length) { + $this->drain(); + } + } + + private function drain() + { + for ($i = key($this->queue); isset($this->queue[$i]); $i++) { + $cancellable = $this->queue[$i]; + + $exception = null; + + try { + $cancellable->cancel(); + } catch (\Throwable $exception) { + } catch (\Exception $exception) { + } + + unset($this->queue[$i]); + + if ($exception) { + throw $exception; + } + } + + $this->queue = []; + } +} diff --git a/vendor/react/promise/src/Exception/LengthException.php b/vendor/react/promise/src/Exception/LengthException.php new file mode 100644 index 00000000..775c48db --- /dev/null +++ b/vendor/react/promise/src/Exception/LengthException.php @@ -0,0 +1,7 @@ +value)); + } catch (\Throwable $exception) { + return new RejectedPromise($exception); } catch (\Exception $exception) { return new RejectedPromise($exception); } diff --git a/vendor/react/promise/src/LazyPromise.php b/vendor/react/promise/src/LazyPromise.php index 919da457..d72619e1 100644 --- a/vendor/react/promise/src/LazyPromise.php +++ b/vendor/react/promise/src/LazyPromise.php @@ -47,6 +47,8 @@ private function promise() if (null === $this->promise) { try { $this->promise = resolve(call_user_func($this->factory)); + } catch (\Throwable $exception) { + $this->promise = new RejectedPromise($exception); } catch (\Exception $exception) { $this->promise = new RejectedPromise($exception); } diff --git a/vendor/react/promise/src/Promise.php b/vendor/react/promise/src/Promise.php index 7af99435..bfbdc06d 100644 --- a/vendor/react/promise/src/Promise.php +++ b/vendor/react/promise/src/Promise.php @@ -104,6 +104,8 @@ private function resolver(callable $onFulfilled = null, callable $onRejected = n $progressHandler = function ($update) use ($notify, $onProgress) { try { $notify($onProgress($update)); + } catch (\Throwable $e) { + $notify($e); } catch (\Exception $e) { $notify($e); } @@ -186,6 +188,8 @@ function ($update = null) { $this->notify($update); } ); + } catch (\Throwable $e) { + $this->reject($e); } catch (\Exception $e) { $this->reject($e); } diff --git a/vendor/react/promise/src/RejectedPromise.php b/vendor/react/promise/src/RejectedPromise.php index fcb9063a..479a746b 100644 --- a/vendor/react/promise/src/RejectedPromise.php +++ b/vendor/react/promise/src/RejectedPromise.php @@ -23,6 +23,8 @@ public function then(callable $onFulfilled = null, callable $onRejected = null, try { return resolve($onRejected($this->reason)); + } catch (\Throwable $exception) { + return new RejectedPromise($exception); } catch (\Exception $exception) { return new RejectedPromise($exception); } diff --git a/vendor/react/promise/src/UnhandledRejectionException.php b/vendor/react/promise/src/UnhandledRejectionException.php index ed166b30..a44b7a1b 100644 --- a/vendor/react/promise/src/UnhandledRejectionException.php +++ b/vendor/react/promise/src/UnhandledRejectionException.php @@ -8,7 +8,7 @@ class UnhandledRejectionException extends \RuntimeException public static function resolve($reason) { - if ($reason instanceof \Exception) { + if ($reason instanceof \Exception || $reason instanceof \Throwable) { return $reason; } diff --git a/vendor/react/promise/src/functions.php b/vendor/react/promise/src/functions.php index 9b361dd9..5f55f2ea 100644 --- a/vendor/react/promise/src/functions.php +++ b/vendor/react/promise/src/functions.php @@ -4,17 +4,23 @@ function resolve($promiseOrValue = null) { - if (!$promiseOrValue instanceof PromiseInterface) { - return new FulfilledPromise($promiseOrValue); - } - if ($promiseOrValue instanceof ExtendedPromiseInterface) { return $promiseOrValue; } - return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) { - $promiseOrValue->then($resolve, $reject, $notify); - }); + if (method_exists($promiseOrValue, 'then')) { + $canceller = null; + + if (method_exists($promiseOrValue, 'cancel')) { + $canceller = [$promiseOrValue, 'cancel']; + } + + return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) { + $promiseOrValue->then($resolve, $reject, $notify); + }, $canceller); + } + + return new FulfilledPromise($promiseOrValue); } function reject($promiseOrValue = null) @@ -37,19 +43,35 @@ function all($promisesOrValues) function race($promisesOrValues) { - return resolve($promisesOrValues) - ->then(function ($array) { - if (!is_array($array) || !$array) { - return resolve(); - } + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($promisesOrValues); + + return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $cancellationQueue) { + resolve($promisesOrValues) + ->done(function ($array) use ($cancellationQueue, $resolve, $reject, $notify) { + if (!is_array($array) || !$array) { + $resolve(); + return; + } + + $fulfiller = function ($value) use ($cancellationQueue, $resolve) { + $cancellationQueue(); + $resolve($value); + }; + + $rejecter = function ($reason) use ($cancellationQueue, $reject) { + $cancellationQueue(); + $reject($reason); + }; - return new Promise(function ($resolve, $reject, $notify) use ($array) { foreach ($array as $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + resolve($promiseOrValue) - ->done($resolve, $reject, $notify); + ->done($fulfiller, $rejecter, $notify); } - }); - }); + }, $reject, $notify); + }, $cancellationQueue); } function any($promisesOrValues) @@ -62,21 +84,38 @@ function any($promisesOrValues) function some($promisesOrValues, $howMany) { - return resolve($promisesOrValues) - ->then(function ($array) use ($howMany) { - if (!is_array($array) || !$array || $howMany < 1) { - return resolve([]); - } - - return new Promise(function ($resolve, $reject, $notify) use ($array, $howMany) { - $len = count($array); - $toResolve = min($howMany, $len); + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($promisesOrValues); + + return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $howMany, $cancellationQueue) { + resolve($promisesOrValues) + ->done(function ($array) use ($howMany, $cancellationQueue, $resolve, $reject, $notify) { + if (!is_array($array) || $howMany < 1) { + $resolve([]); + return; + } + + $len = count($array); + + if ($len < $howMany) { + throw new Exception\LengthException( + sprintf( + 'Input array must contain at least %d item%s but contains only %s item%s.', + $howMany, + 1 === $howMany ? '' : 's', + $len, + 1 === $len ? '' : 's' + ) + ); + } + + $toResolve = $howMany; $toReject = ($len - $toResolve) + 1; $values = []; $reasons = []; foreach ($array as $i => $promiseOrValue) { - $fulfiller = function ($val) use ($i, &$values, &$toResolve, $toReject, $resolve) { + $fulfiller = function ($val) use ($i, &$values, &$toResolve, $toReject, $resolve, $cancellationQueue) { if ($toResolve < 1 || $toReject < 1) { return; } @@ -84,11 +123,12 @@ function some($promisesOrValues, $howMany) $values[$i] = $val; if (0 === --$toResolve) { + $cancellationQueue(); $resolve($values); } }; - $rejecter = function ($reason) use ($i, &$reasons, &$toReject, $toResolve, $reject) { + $rejecter = function ($reason) use ($i, &$reasons, &$toReject, $toResolve, $reject, $cancellationQueue) { if ($toResolve < 1 || $toReject < 1) { return; } @@ -96,30 +136,39 @@ function some($promisesOrValues, $howMany) $reasons[$i] = $reason; if (0 === --$toReject) { + $cancellationQueue(); $reject($reasons); } }; + $cancellationQueue->enqueue($promiseOrValue); + resolve($promiseOrValue) ->done($fulfiller, $rejecter, $notify); } - }); - }); + }, $reject, $notify); + }, $cancellationQueue); } function map($promisesOrValues, callable $mapFunc) { - return resolve($promisesOrValues) - ->then(function ($array) use ($mapFunc) { - if (!is_array($array) || !$array) { - return resolve([]); - } + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($promisesOrValues); + + return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $mapFunc, $cancellationQueue) { + resolve($promisesOrValues) + ->done(function ($array) use ($mapFunc, $cancellationQueue, $resolve, $reject, $notify) { + if (!is_array($array) || !$array) { + $resolve([]); + return; + } - return new Promise(function ($resolve, $reject, $notify) use ($array, $mapFunc) { $toResolve = count($array); $values = []; foreach ($array as $i => $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + resolve($promiseOrValue) ->then($mapFunc) ->done( @@ -134,35 +183,45 @@ function ($mapped) use ($i, &$values, &$toResolve, $resolve) { $notify ); } - }); - }); + }, $reject, $notify); + }, $cancellationQueue); } function reduce($promisesOrValues, callable $reduceFunc, $initialValue = null) { - return resolve($promisesOrValues) - ->then(function ($array) use ($reduceFunc, $initialValue) { - if (!is_array($array)) { - $array = []; - } - - $total = count($array); - $i = 0; - - // Wrap the supplied $reduceFunc with one that handles promises and then - // delegates to the supplied. - $wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $total, &$i) { - return resolve($current) - ->then(function ($c) use ($reduceFunc, $total, &$i, $val) { - return resolve($val) - ->then(function ($value) use ($reduceFunc, $total, &$i, $c) { - return $reduceFunc($c, $value, $i++, $total); - }); - }); - }; - - return array_reduce($array, $wrappedReduceFunc, $initialValue); - }); + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($promisesOrValues); + + return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $reduceFunc, $initialValue, $cancellationQueue) { + resolve($promisesOrValues) + ->done(function ($array) use ($reduceFunc, $initialValue, $cancellationQueue, $resolve, $reject, $notify) { + if (!is_array($array)) { + $array = []; + } + + $total = count($array); + $i = 0; + + // Wrap the supplied $reduceFunc with one that handles promises and then + // delegates to the supplied. + $wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $cancellationQueue, $total, &$i) { + $cancellationQueue->enqueue($val); + + return $current + ->then(function ($c) use ($reduceFunc, $total, &$i, $val) { + return resolve($val) + ->then(function ($value) use ($reduceFunc, $total, &$i, $c) { + return $reduceFunc($c, $value, $i++, $total); + }); + }); + }; + + $cancellationQueue->enqueue($initialValue); + + array_reduce($array, $wrappedReduceFunc, resolve($initialValue)) + ->done($resolve, $reject, $notify); + }, $reject, $notify); + }, $cancellationQueue); } // Internal functions diff --git a/vendor/react/promise/tests/CancellationQueueTest.php b/vendor/react/promise/tests/CancellationQueueTest.php new file mode 100644 index 00000000..cf67b7b0 --- /dev/null +++ b/vendor/react/promise/tests/CancellationQueueTest.php @@ -0,0 +1,98 @@ +enqueue($p); + + $cancellationQueue(); + + $this->assertTrue($p->cancelCalled); + } + + /** @test */ + public function ignoresSimpleCancellable() + { + $p = new SimpleTestCancellable(); + + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($p); + + $cancellationQueue(); + + $this->assertFalse($p->cancelCalled); + } + + /** @test */ + public function callsCancelOnPromisesEnqueuedBeforeStart() + { + $d1 = $this->getCancellableDeferred(); + $d2 = $this->getCancellableDeferred(); + + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($d1->promise()); + $cancellationQueue->enqueue($d2->promise()); + + $cancellationQueue(); + } + + /** @test */ + public function callsCancelOnPromisesEnqueuedAfterStart() + { + $d1 = $this->getCancellableDeferred(); + $d2 = $this->getCancellableDeferred(); + + $cancellationQueue = new CancellationQueue(); + + $cancellationQueue(); + + $cancellationQueue->enqueue($d2->promise()); + $cancellationQueue->enqueue($d1->promise()); + } + + /** @test */ + public function doesNotCallCancelTwiceWhenStartedTwice() + { + $d = $this->getCancellableDeferred(); + + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($d->promise()); + + $cancellationQueue(); + $cancellationQueue(); + } + + /** @test */ + public function rethrowsExceptionsThrownFromCancel() + { + $this->setExpectedException('\Exception', 'test'); + + $mock = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock + ->expects($this->once()) + ->method('cancel') + ->will($this->throwException(new \Exception('test'))); + + $cancellationQueue = new CancellationQueue(); + $cancellationQueue->enqueue($mock); + + $cancellationQueue(); + } + + private function getCancellableDeferred() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke'); + + return new Deferred($mock); + } +} diff --git a/vendor/react/promise/tests/FunctionAnyTest.php b/vendor/react/promise/tests/FunctionAnyTest.php index bf8a0db4..6c40674b 100644 --- a/vendor/react/promise/tests/FunctionAnyTest.php +++ b/vendor/react/promise/tests/FunctionAnyTest.php @@ -2,18 +2,38 @@ namespace React\Promise; +use React\Promise\Exception\LengthException; + class FunctionAnyTest extends TestCase { /** @test */ - public function shouldResolveToNullWithEmptyInputArray() + public function shouldRejectWithLengthExceptionWithEmptyInputArray() { $mock = $this->createCallableMock(); $mock ->expects($this->once()) ->method('__invoke') - ->with($this->identicalTo(null)); + ->with( + $this->callback(function($exception){ + return $exception instanceof LengthException && + 'Input array must contain at least 1 item but contains only 0 items.' === $exception->getMessage(); + }) + ); any([]) + ->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldResolveToNullWithNonArrayInput() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo(null)); + + any(null) ->then($mock); } @@ -113,4 +133,64 @@ public function shouldNotRelyOnArryIndexesWhenUnwrappingToASingleResolutionValue $d2->resolve(2); $d1->resolve(1); } + + /** @test */ + public function shouldRejectWhenInputPromiseRejects() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo(null)); + + any(reject()) + ->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldCancelInputPromise() + { + $mock = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock + ->expects($this->once()) + ->method('cancel'); + + any($mock)->cancel(); + } + + /** @test */ + public function shouldCancelInputArrayPromises() + { + $mock1 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock1 + ->expects($this->once()) + ->method('cancel'); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + any([$mock1, $mock2])->cancel(); + } + + /** @test */ + public function shouldCancelOtherPendingInputArrayPromisesIfOnePromiseFulfills() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->never()) + ->method('__invoke'); + + + $deferred = New Deferred($mock); + $deferred->resolve(); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + some([$deferred->promise(), $mock2], 1)->cancel(); + } } diff --git a/vendor/react/promise/tests/FunctionMapTest.php b/vendor/react/promise/tests/FunctionMapTest.php index b8bf3a83..5e86284e 100644 --- a/vendor/react/promise/tests/FunctionMapTest.php +++ b/vendor/react/promise/tests/FunctionMapTest.php @@ -122,4 +122,52 @@ public function shouldRejectWhenInputContainsRejection() $this->mapper() )->then($this->expectCallableNever(), $mock); } + + /** @test */ + public function shouldRejectWhenInputPromiseRejects() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo(null)); + + map( + reject(), + $this->mapper() + )->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldCancelInputPromise() + { + $mock = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock + ->expects($this->once()) + ->method('cancel'); + + map( + $mock, + $this->mapper() + )->cancel(); + } + + /** @test */ + public function shouldCancelInputArrayPromises() + { + $mock1 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock1 + ->expects($this->once()) + ->method('cancel'); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + map( + [$mock1, $mock2], + $this->mapper() + )->cancel(); + } } diff --git a/vendor/react/promise/tests/FunctionRaceTest.php b/vendor/react/promise/tests/FunctionRaceTest.php index 553220c5..6cd1e987 100644 --- a/vendor/react/promise/tests/FunctionRaceTest.php +++ b/vendor/react/promise/tests/FunctionRaceTest.php @@ -119,4 +119,83 @@ public function shouldResolveToNullWhenInputPromiseDoesNotResolveToArray() resolve(1) )->then($mock); } + + /** @test */ + public function shouldRejectWhenInputPromiseRejects() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo(null)); + + race( + reject() + )->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldCancelInputPromise() + { + $mock = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock + ->expects($this->once()) + ->method('cancel'); + + race($mock)->cancel(); + } + + /** @test */ + public function shouldCancelInputArrayPromises() + { + $mock1 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock1 + ->expects($this->once()) + ->method('cancel'); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + race([$mock1, $mock2])->cancel(); + } + + /** @test */ + public function shouldCancelOtherPendingInputArrayPromisesIfOnePromiseFulfills() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->never()) + ->method('__invoke'); + + $deferred = New Deferred($mock); + $deferred->resolve(); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + race([$deferred->promise(), $mock2])->cancel(); + } + + /** @test */ + public function shouldCancelOtherPendingInputArrayPromisesIfOnePromiseRejects() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->never()) + ->method('__invoke'); + + $deferred = New Deferred($mock); + $deferred->reject(); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + race([$deferred->promise(), $mock2])->cancel(); + } } diff --git a/vendor/react/promise/tests/FunctionReduceTest.php b/vendor/react/promise/tests/FunctionReduceTest.php index 715e8477..3c17511c 100644 --- a/vendor/react/promise/tests/FunctionReduceTest.php +++ b/vendor/react/promise/tests/FunctionReduceTest.php @@ -287,4 +287,55 @@ public function shouldProvideCorrectBasisValue() $d1->resolve(1); $d2->resolve(2); } + + /** @test */ + public function shouldRejectWhenInputPromiseRejects() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo(null)); + + reduce( + reject(), + $this->plus(), + 1 + )->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldCancelInputPromise() + { + $mock = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock + ->expects($this->once()) + ->method('cancel'); + + reduce( + $mock, + $this->plus(), + 1 + )->cancel(); + } + + /** @test */ + public function shouldCancelInputArrayPromises() + { + $mock1 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock1 + ->expects($this->once()) + ->method('cancel'); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + reduce( + [$mock1, $mock2], + $this->plus(), + 1 + )->cancel(); + } } diff --git a/vendor/react/promise/tests/FunctionResolveTest.php b/vendor/react/promise/tests/FunctionResolveTest.php index 576c3093..216cbb0c 100644 --- a/vendor/react/promise/tests/FunctionResolveTest.php +++ b/vendor/react/promise/tests/FunctionResolveTest.php @@ -42,6 +42,35 @@ public function shouldResolveAFulfilledPromise() ); } + /** @test */ + public function shouldResolveAThenable() + { + $thenable = new SimpleFulfilledTestThenable(); + + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo('foo')); + + resolve($thenable) + ->then( + $mock, + $this->expectCallableNever() + ); + } + + /** @test */ + public function shouldResolveACancellableThenable() + { + $thenable = new SimpleTestCancellableThenable(); + + $promise = resolve($thenable); + $promise->cancel(); + + $this->assertTrue($thenable->cancelCalled); + } + /** @test */ public function shouldRejectARejectedPromise() { @@ -92,6 +121,44 @@ function ($val) { $result->then($mock); } + /** @test */ + public function shouldSupportVeryDeepNestedPromises() + { + $deferreds = []; + + // @TODO Increase count once global-queue is merged + for ($i = 0; $i < 10; $i++) { + $deferreds[] = $d = new Deferred(); + $p = $d->promise(); + + $last = $p; + for ($j = 0; $j < 10; $j++) { + $last = $last->then(function($result) { + return $result; + }); + } + } + + $p = null; + foreach ($deferreds as $d) { + if ($p) { + $d->resolve($p); + } + + $p = $d->promise(); + } + + $deferreds[0]->resolve(true); + + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo(true)); + + $deferreds[0]->promise()->then($mock); + } + /** @test */ public function returnsExtendePromiseForSimplePromise() { diff --git a/vendor/react/promise/tests/FunctionSomeTest.php b/vendor/react/promise/tests/FunctionSomeTest.php index 09e53504..374c84f0 100644 --- a/vendor/react/promise/tests/FunctionSomeTest.php +++ b/vendor/react/promise/tests/FunctionSomeTest.php @@ -2,20 +2,62 @@ namespace React\Promise; +use React\Promise\Exception\LengthException; + class FunctionSomeTest extends TestCase { /** @test */ - public function shouldResolveEmptyInput() + public function shouldRejectWithLengthExceptionWithEmptyInputArray() { $mock = $this->createCallableMock(); $mock ->expects($this->once()) ->method('__invoke') - ->with($this->identicalTo([])); + ->with( + $this->callback(function($exception){ + return $exception instanceof LengthException && + 'Input array must contain at least 1 item but contains only 0 items.' === $exception->getMessage(); + }) + ); some( [], 1 + )->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldRejectWithLengthExceptionWithInputArrayContainingNotEnoughItems() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with( + $this->callback(function($exception){ + return $exception instanceof LengthException && + 'Input array must contain at least 4 items but contains only 3 items.' === $exception->getMessage(); + }) + ); + + some( + [1, 2, 3], + 4 + )->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldResolveToEmptyArrayWithNonArrayInput() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo([])); + + some( + null, + 1 )->then($mock); } @@ -123,4 +165,84 @@ public function shouldResolveToEmptyArrayWhenInputPromiseDoesNotResolveToArray() 1 )->then($mock); } + + /** @test */ + public function shouldRejectWhenInputPromiseRejects() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->once()) + ->method('__invoke') + ->with($this->identicalTo(null)); + + some( + reject(), + 1 + )->then($this->expectCallableNever(), $mock); + } + + /** @test */ + public function shouldCancelInputPromise() + { + $mock = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock + ->expects($this->once()) + ->method('cancel'); + + some($mock, 1)->cancel(); + } + + /** @test */ + public function shouldCancelInputArrayPromises() + { + $mock1 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock1 + ->expects($this->once()) + ->method('cancel'); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + some([$mock1, $mock2], 1)->cancel(); + } + + /** @test */ + public function shouldCancelOtherPendingInputArrayPromisesIfEnoughPromisesFulfill() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->never()) + ->method('__invoke'); + + $deferred = New Deferred($mock); + $deferred->resolve(); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + some([$deferred->promise(), $mock2], 1); + } + + /** @test */ + public function shouldCancelOtherPendingInputArrayPromisesIfEnoughPromisesReject() + { + $mock = $this->createCallableMock(); + $mock + ->expects($this->never()) + ->method('__invoke'); + + $deferred = New Deferred($mock); + $deferred->reject(); + + $mock2 = $this->getMock('React\Promise\CancellablePromiseInterface'); + $mock2 + ->expects($this->once()) + ->method('cancel'); + + some([$deferred->promise(), $mock2], 2); + } } diff --git a/vendor/react/promise/tests/PromiseTest.php b/vendor/react/promise/tests/PromiseTest.php index faba7046..dc7b733d 100644 --- a/vendor/react/promise/tests/PromiseTest.php +++ b/vendor/react/promise/tests/PromiseTest.php @@ -82,35 +82,3 @@ public function shouldRejectIfRejectedWithSimplePromise() $adapter->resolve(new SimpleRejectedTestPromise()); } } - -class SimpleFulfilledTestPromise implements PromiseInterface -{ - public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - try { - if ($onFulfilled) { - $onFulfilled('foo'); - } - - return new self('foo'); - } catch (\Exception $exception) { - return new RejectedPromise($exception); - } - } -} - -class SimpleRejectedTestPromise implements PromiseInterface -{ - public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - try { - if ($onRejected) { - $onRejected('foo'); - } - - return new self('foo'); - } catch (\Exception $exception) { - return new RejectedPromise($exception); - } - } -} diff --git a/vendor/react/promise/tests/PromiseTest/PromiseRejectedTestTrait.php b/vendor/react/promise/tests/PromiseTest/PromiseRejectedTestTrait.php index 64255e83..98d1dcf9 100644 --- a/vendor/react/promise/tests/PromiseTest/PromiseRejectedTestTrait.php +++ b/vendor/react/promise/tests/PromiseTest/PromiseRejectedTestTrait.php @@ -3,6 +3,7 @@ namespace React\Promise\PromiseTest; use React\Promise\Deferred; +use React\Promise\UnhandledRejectionException; trait PromiseRejectedTestTrait { @@ -222,6 +223,25 @@ public function doneShouldThrowUnhandledRejectionExceptionWhenRejectedWithNonExc $this->assertNull($adapter->promise()->done()); } + /** @test */ + public function unhandledRejectionExceptionThrownByDoneHoldsRejectionValue() + { + $adapter = $this->getPromiseTestAdapter(); + + $expected = new \stdClass(); + + $adapter->reject($expected); + + try { + $adapter->promise()->done(); + } catch (UnhandledRejectionException $e) { + $this->assertSame($expected, $e->getReason()); + return; + } + + $this->fail(); + } + /** @test */ public function doneShouldThrowUnhandledRejectionExceptionWhenRejectionHandlerRejectsForRejectedPromise() { diff --git a/vendor/react/promise/tests/fixtures/SimpleFulfilledTestPromise.php b/vendor/react/promise/tests/fixtures/SimpleFulfilledTestPromise.php new file mode 100644 index 00000000..ef4d5301 --- /dev/null +++ b/vendor/react/promise/tests/fixtures/SimpleFulfilledTestPromise.php @@ -0,0 +1,21 @@ +cancelCalled = true; + } +} diff --git a/vendor/react/promise/tests/fixtures/SimpleTestCancellableThenable.php b/vendor/react/promise/tests/fixtures/SimpleTestCancellableThenable.php new file mode 100644 index 00000000..c0f15933 --- /dev/null +++ b/vendor/react/promise/tests/fixtures/SimpleTestCancellableThenable.php @@ -0,0 +1,18 @@ +cancelCalled = true; + } +} diff --git a/vendor/sebastian/environment/src/Console.php b/vendor/sebastian/environment/src/Console.php index 100c36d9..2aff1d65 100644 --- a/vendor/sebastian/environment/src/Console.php +++ b/vendor/sebastian/environment/src/Console.php @@ -84,13 +84,13 @@ public function getNumberOfColumns() return 80; } - if (preg_match('#\d+ (\d+)#', shell_exec('stty size'), $match) === 1) { + if (function_exists('shell_exec') && preg_match('#\d+ (\d+)#', shell_exec('stty size'), $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } } - if (preg_match('#columns = (\d+);#', shell_exec('stty'), $match) === 1) { + if (function_exists('shell_exec') && preg_match('#columns = (\d+);#', shell_exec('stty'), $match) === 1) { if ((int) $match[1] > 0) { return (int) $match[1]; } diff --git a/vendor/sebastian/environment/src/Runtime.php b/vendor/sebastian/environment/src/Runtime.php index f12071a6..c8985b17 100644 --- a/vendor/sebastian/environment/src/Runtime.php +++ b/vendor/sebastian/environment/src/Runtime.php @@ -123,7 +123,7 @@ public function getVendorUrl() if ($this->isHHVM()) { return 'http://hhvm.com/'; } else { - return 'http://php.net/'; + return 'https://secure.php.net/'; } } diff --git a/vendor/sebastian/exporter/composer.json b/vendor/sebastian/exporter/composer.json index 723596e1..62b94bda 100644 --- a/vendor/sebastian/exporter/composer.json +++ b/vendor/sebastian/exporter/composer.json @@ -31,7 +31,8 @@ "sebastian/recursion-context": "~1.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "~4.4", + "ext-mbstring": "*" }, "autoload": { "classmap": [ @@ -40,7 +41,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } } } diff --git a/vendor/sebastian/exporter/src/Exporter.php b/vendor/sebastian/exporter/src/Exporter.php index a9f5157c..5578aa8d 100644 --- a/vendor/sebastian/exporter/src/Exporter.php +++ b/vendor/sebastian/exporter/src/Exporter.php @@ -89,11 +89,10 @@ public function shortenedRecursiveExport(&$data, Context $context = null) * Exports a value into a single-line string * * The output of this method is similar to the output of - * SebastianBergmann\Exporter\Exporter::export. This method guarantees - * thought that the result contains now newlines. + * SebastianBergmann\Exporter\Exporter::export(). * - * Newlines are replaced by the visible string '\n'. Contents of arrays - * and objects (if any) are replaced by '...'. + * Newlines are replaced by the visible string '\n'. + * Contents of arrays and objects (if any) are replaced by '...'. * * @param mixed $value * @return string @@ -104,8 +103,14 @@ public function shortenedExport($value) if (is_string($value)) { $string = $this->export($value); - if (strlen($string) > 40) { - $string = substr($string, 0, 30) . '...' . substr($string, -7); + if (function_exists('mb_strlen')) { + if (mb_strlen($string) > 40) { + $string = mb_substr($string, 0, 30) . '...' . mb_substr($string, -7); + } + } else { + if (strlen($string) > 40) { + $string = substr($string, 0, 30) . '...' . substr($string, -7); + } } return str_replace("\n", '\n', $string); @@ -225,7 +230,7 @@ protected function recursiveExport(&$value, $indentation, $processed = null) if (is_string($value)) { // Match for most non printable chars somewhat taking multibyte chars into account - if (preg_match('/[^\x09-\x0d\x20-\xff]/', $value)) { + if (preg_match('/[^\x09-\x0d\x1b\x20-\xff]/', $value)) { return 'Binary String: 0x' . bin2hex($value); } diff --git a/vendor/sebastian/exporter/tests/ExporterTest.php b/vendor/sebastian/exporter/tests/ExporterTest.php index 6b590bfb..b0546f19 100644 --- a/vendor/sebastian/exporter/tests/ExporterTest.php +++ b/vendor/sebastian/exporter/tests/ExporterTest.php @@ -300,6 +300,31 @@ public function testShortenedExport($value, $expected) ); } + /** + * @requires extension mbstring + */ + public function testShortenedExportForMultibyteCharacters() + { + $oldMbLanguage = mb_language(); + mb_language('Japanese'); + $oldMbInternalEncoding = mb_internal_encoding(); + mb_internal_encoding('UTF-8'); + + try { + $this->assertSame( + "'恄悍ćÆ恫恻ćøćØć”ć‚Šć¬ć‚‹ć‚’ć‚ć‹ć‚ˆćŸć‚Œćć¤ć­ćŖć‚‰ć‚€ć†ć‚ć®ćŠćć‚„...ć—ć‚‘ć²ć‚‚ć›ć™'", + $this->trimNewline($this->exporter->shortenedExport('恄悍ćÆ恫恻ćøćØć”ć‚Šć¬ć‚‹ć‚’ć‚ć‹ć‚ˆćŸć‚Œćć¤ć­ćŖć‚‰ć‚€ć†ć‚ć®ćŠćć‚„ć¾ć‘ćµć“ćˆć¦ć‚ć•ćć‚†ć‚ćæć—ć‚‘ć²ć‚‚ć›ć™')) + ); + } catch (\Exception $e) { + mb_internal_encoding($oldMbInternalEncoding); + mb_language($oldMbLanguage); + throw $e; + } + + mb_internal_encoding($oldMbInternalEncoding); + mb_language($oldMbLanguage); + } + public function provideNonBinaryMultibyteStrings() { return array( diff --git a/vendor/squizlabs/php_codesniffer/.gitignore b/vendor/squizlabs/php_codesniffer/.gitignore index f9f525aa..99658952 100644 --- a/vendor/squizlabs/php_codesniffer/.gitignore +++ b/vendor/squizlabs/php_codesniffer/.gitignore @@ -3,3 +3,4 @@ /phpunit.xml .idea/* /vendor/ +composer.lock diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer.php b/vendor/squizlabs/php_codesniffer/CodeSniffer.php index 19ea3e6e..91dbbffb 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer.php @@ -73,7 +73,7 @@ class PHP_CodeSniffer * * @var string */ - const VERSION = '2.5.1'; + const VERSION = '2.6.2'; /** * Package stability; either stable, beta or alpha. @@ -129,6 +129,16 @@ class PHP_CodeSniffer */ protected $sniffs = array(); + /** + * A mapping of sniff codes to fully qualified class names. + * + * The key is the sniff code and the value + * is the fully qualified name of the sniff class. + * + * @var array + */ + public $sniffCodes = array(); + /** * The listeners array, indexed by token type. * @@ -503,11 +513,12 @@ public function process($files, $standards, array $restrictions=array(), $local= * * @param string|array $standards The set of code sniffs we are testing * against. - * @param array $restrictions The sniff codes to restrict the + * @param array $restrictions The sniff codes to restrict the testing to. + * @param array $exclusions The sniff codes to exclude from testing. * * @return void */ - public function initStandard($standards, array $restrictions=array()) + public function initStandard($standards, array $restrictions=array(), array $exclusions=array()) { $standards = (array) $standards; @@ -537,7 +548,7 @@ public function initStandard($standards, array $restrictions=array()) } if (PHP_CODESNIFFER_VERBOSITY === 1) { - $ruleset = simplexml_load_string(file_get_contents($standard)); + $ruleset = simplexml_load_file($standard); if ($ruleset !== false) { $standardName = (string) $ruleset['name']; } @@ -557,7 +568,13 @@ public function initStandard($standards, array $restrictions=array()) $sniffRestrictions[] = $parts[0].'_sniffs_'.$parts[1].'_'.$parts[2].'sniff'; } - $this->registerSniffs($sniffs, $sniffRestrictions); + $sniffExclusions = array(); + foreach ($exclusions as $sniffCode) { + $parts = explode('.', strtolower($sniffCode)); + $sniffExclusions[] = $parts[0].'_sniffs_'.$parts[1].'_'.$parts[2].'sniff'; + } + + $this->registerSniffs($sniffs, $sniffRestrictions, $sniffExclusions); $this->populateTokenListeners(); if (PHP_CODESNIFFER_VERBOSITY === 1) { @@ -694,7 +711,7 @@ public function processRuleset($rulesetPath, $depth=0) echo "Processing ruleset $rulesetPath".PHP_EOL; } - $ruleset = simplexml_load_string(file_get_contents($rulesetPath)); + $ruleset = simplexml_load_file($rulesetPath); if ($ruleset === false) { throw new PHP_CodeSniffer_Exception("Ruleset $rulesetPath is not valid"); } @@ -705,7 +722,6 @@ public function processRuleset($rulesetPath, $depth=0) $cliValues = $this->cli->getCommandLineValues(); $rulesetDir = dirname($rulesetPath); - $rulesetName = basename($rulesetPath); self::$rulesetDirs[] = $rulesetDir; if (is_dir($rulesetDir.DIRECTORY_SEPARATOR.'Sniffs') === true) { @@ -717,6 +733,19 @@ public function processRuleset($rulesetPath, $depth=0) $ownSniffs = $this->_expandSniffDirectory($rulesetDir.DIRECTORY_SEPARATOR.'Sniffs', $depth); } + // Process custom sniff config settings. + foreach ($ruleset->{'config'} as $config) { + if ($this->_shouldProcessElement($config) === false) { + continue; + } + + $this->setConfigData((string) $config['name'], (string) $config['value'], true); + if (PHP_CODESNIFFER_VERBOSITY > 1) { + echo str_repeat("\t", $depth); + echo "\t=> set config value ".(string) $config['name'].': '.(string) $config['value'].PHP_EOL; + } + } + foreach ($ruleset->rule as $rule) { if (isset($rule['ref']) === false || $this->_shouldProcessElement($rule) === false @@ -818,7 +847,7 @@ public function processRuleset($rulesetPath, $depth=0) } }//end foreach - if (empty($cliValues['files']) === true) { + if (empty($cliValues['files']) === true && $cliValues['stdin'] === null) { // Process hard-coded file paths. foreach ($ruleset->{'file'} as $file) { $file = (string) $file; @@ -831,19 +860,19 @@ public function processRuleset($rulesetPath, $depth=0) } if (empty($cliArgs) === false) { - $this->cli->setCommandLineValues($cliArgs); - } - - // Process custom sniff config settings. - foreach ($ruleset->{'config'} as $config) { - if ($this->_shouldProcessElement($config) === false) { - continue; + // Change the directory so all relative paths are worked + // out based on the location of the ruleset instead of + // the location of the user. + $inPhar = self::isPharFile($rulesetDir); + if ($inPhar === false) { + $currentDir = getcwd(); + chdir($rulesetDir); } - $this->setConfigData((string) $config['name'], (string) $config['value'], true); - if (PHP_CODESNIFFER_VERBOSITY > 1) { - echo str_repeat("\t", $depth); - echo "\t=> set config value ".(string) $config['name'].': '.(string) $config['value'].PHP_EOL; + $this->cli->setCommandLineValues($cliArgs); + + if ($inPhar === false) { + chdir($currentDir); } } @@ -1312,11 +1341,13 @@ private function _shouldProcessElement($element, $depth=0) * @param array $files Paths to the sniff files to register. * @param array $restrictions The sniff class names to restrict the allowed * listeners to. + * @param array $exclusions The sniff class names to exclude from the + * listeners list. * * @return void * @throws PHP_CodeSniffer_Exception If a sniff file path is invalid. */ - public function registerSniffs($files, $restrictions) + public function registerSniffs($files, $restrictions, $exclusions) { $listeners = array(); @@ -1350,6 +1381,14 @@ public function registerSniffs($files, $restrictions) continue; } + // If they have specified a list of sniffs to exclude, check + // to see if this sniff is allowed. + if (empty($exclusions) === false + && in_array(strtolower($className), $exclusions) === true + ) { + continue; + } + include_once $file; // Support the use of PHP namespaces. If the class name we included @@ -1402,6 +1441,7 @@ public function populateTokenListeners() $code = substr($code, 0, -5); $this->listeners[$listenerClass] = new $listenerClass(); + $this->sniffCodes[$code] = $listenerClass; // Set custom properties. if (isset($this->ruleset[$code]['properties']) === true) { @@ -1694,6 +1734,7 @@ public function processFile($file, $contents=null) $firstContent = $contents; if ($contents === null && is_readable($filePath) === true) { $handle = fopen($filePath, 'r'); + stream_set_blocking($handle, true); if ($handle !== false) { $firstContent = fgets($handle); $firstContent .= fgets($handle); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/CLI.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/CLI.php index 6fa0195d..9ee1c033 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/CLI.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/CLI.php @@ -14,11 +14,13 @@ error_reporting(E_ALL | E_STRICT); -// Installations via Composer: make sure that we autoload all dependencies. -if (file_exists($a = dirname(__FILE__).'/../../../autoload.php') === true) { - include_once $a; -} else if (file_exists($a = dirname(__FILE__).'/../vendor/autoload.php') === true) { - include_once $a; +// Make sure that we autoload all dependencies if running via Composer. +if (version_compare(PHP_VERSION, '5.3.2', '>=') === true) { + if (file_exists($a = dirname(__FILE__).'/../../../autoload.php') === true) { + include_once $a; + } else if (file_exists($a = dirname(__FILE__).'/../vendor/autoload.php') === true) { + include_once $a; + } } if (file_exists($a = dirname(__FILE__).'/../CodeSniffer.php') === true) { @@ -243,7 +245,7 @@ public function runphpcbf() public function checkRequirements() { // Check the PHP version. - if (version_compare(PHP_VERSION, '5.1.2') === -1) { + if (version_compare(PHP_VERSION, '5.1.2', '<') === true) { echo 'ERROR: PHP_CodeSniffer requires PHP version 5.1.2 or greater.'.PHP_EOL; exit(2); } @@ -278,6 +280,7 @@ public function getDefaults() $defaults['showSources'] = false; $defaults['extensions'] = array(); $defaults['sniffs'] = array(); + $defaults['exclude'] = array(); $defaults['ignored'] = array(); $defaults['reportFile'] = null; $defaults['generator'] = ''; @@ -285,6 +288,8 @@ public function getDefaults() $defaults['bootstrap'] = array(); $defaults['errorSeverity'] = null; $defaults['warningSeverity'] = null; + $defaults['stdin'] = null; + $defaults['stdinPath'] = ''; $reportFormat = PHP_CodeSniffer::getConfigData('report_format'); if ($reportFormat !== null) { @@ -344,6 +349,13 @@ public function getDefaults() $defaults['showProgress'] = (bool) $showProgress; } + $quiet = PHP_CodeSniffer::getConfigData('quiet'); + if ($quiet === null) { + $defaults['quiet'] = false; + } else { + $defaults['quiet'] = (bool) $quiet; + } + $colors = PHP_CodeSniffer::getConfigData('colors'); if ($colors === null) { $defaults['colors'] = false; @@ -378,12 +390,27 @@ public function getCommandLineValues() return $this->values; } - $values = $this->getDefaults(); - $args = $_SERVER['argv']; array_shift($args); $this->setCommandLineValues($args); + + // Check for content on STDIN. + $handle = fopen('php://stdin', 'r'); + if (stream_set_blocking($handle, false) === true) { + $fileContents = ''; + while (($line = fgets(STDIN)) !== false) { + $fileContents .= $line; + usleep(10); + } + + stream_set_blocking($handle, true); + fclose($handle); + if (trim($fileContents) !== '') { + $this->values['stdin'] = $fileContents; + } + } + return $this->values; }//end getCommandLineValues() @@ -399,7 +426,7 @@ public function getCommandLineValues() public function setCommandLineValues($args) { if (defined('PHP_CODESNIFFER_IN_TESTS') === true) { - $this->values = array(); + $this->values = array('stdin' => null); } else if (empty($this->values) === true) { $this->values = $this->getDefaults(); } @@ -454,12 +481,15 @@ public function processShortArgument($arg, $pos) case '?': $this->printUsage(); exit(0); - break; case 'i' : $this->printInstalledStandards(); exit(0); - break; case 'v' : + if ($this->values['quiet'] === true) { + // Ignore when quiet mode is enabled. + break; + } + if (isset($this->values['verbosity']) === false) { $this->values['verbosity'] = 1; } else { @@ -479,8 +509,19 @@ public function processShortArgument($arg, $pos) $this->values['explain'] = true; break; case 'p' : + if ($this->values['quiet'] === true) { + // Ignore when quiet mode is enabled. + break; + } + $this->values['showProgress'] = true; break; + case 'q' : + // Quiet mode disables a few other settings as well. + $this->values['quiet'] = true; + $this->values['showProgress'] = false; + $this->values['verbosity'] = 0; + break; case 'd' : $ini = explode('=', $this->_cliArgs[($pos + 1)]); $this->_cliArgs[($pos + 1)] = ''; @@ -610,6 +651,17 @@ public function processLongArgument($arg, $pos) } $this->values['sniffs'] = $sniffs; + } else if (substr($arg, 0, 8) === 'exclude=') { + $sniffs = explode(',', substr($arg, 8)); + foreach ($sniffs as $sniff) { + if (substr_count($sniff, '.') !== 2) { + echo 'ERROR: The specified sniff code "'.$sniff.'" is invalid'.PHP_EOL.PHP_EOL; + $this->printUsage(); + exit(2); + } + } + + $this->values['exclude'] = $sniffs; } else if (substr($arg, 0, 10) === 'bootstrap=') { $files = explode(',', substr($arg, 10)); foreach ($files as $file) { @@ -622,6 +674,13 @@ public function processLongArgument($arg, $pos) $this->values['bootstrap'][] = $path; } + } else if (substr($arg, 0, 11) === 'stdin-path=') { + $this->values['stdinPath'] = PHP_CodeSniffer::realpath(substr($arg, 11)); + + // It may not exist and return false instead, so just use whatever they gave us. + if ($this->values['stdinPath'] === false) { + $this->values['stdinPath'] = trim(substr($arg, 11)); + } } else if (substr($arg, 0, 12) === 'report-file=') { $this->values['reportFile'] = PHP_CodeSniffer::realpath(substr($arg, 12)); @@ -696,6 +755,10 @@ public function processLongArgument($arg, $pos) $this->values['standard'] = explode(',', $standards); } } else if (substr($arg, 0, 11) === 'extensions=') { + if (isset($this->values['extensions']) === false) { + $this->values['extensions'] = array(); + } + $this->values['extensions'] = array_merge($this->values['extensions'], explode(',', substr($arg, 11))); } else if (substr($arg, 0, 9) === 'severity=') { $this->values['errorSeverity'] = (int) substr($arg, 9); @@ -841,7 +904,7 @@ public function process($values=array()) $phpcs = new PHP_CodeSniffer($values['verbosity'], null, null, null); $phpcs->setCli($this); - $phpcs->initStandard($values['standard'], $values['sniffs']); + $phpcs->initStandard($values['standard'], $values['sniffs'], $values['exclude']); $values = $this->values; $phpcs->setTabWidth($values['tabWidth']); @@ -885,11 +948,15 @@ public function process($values=array()) $phpcs->processFiles($values['files'], $values['local']); - if (empty($values['files']) === true) { - // Check if they are passing in the file contents. - $handle = fopen('php://stdin', 'r'); - $fileContents = stream_get_contents($handle); - fclose($handle); + if (empty($values['files']) === true || $values['stdin'] !== null) { + $fileContents = $values['stdin']; + if ($fileContents === null) { + // Check if they are passing in the file contents. + $handle = fopen('php://stdin', 'r'); + stream_set_blocking($handle, true); + $fileContents = stream_get_contents($handle); + fclose($handle); + } if ($fileContents === '') { // No files and no content passed in. @@ -897,9 +964,7 @@ public function process($values=array()) $this->printUsage(); exit(2); } else { - if ($fileContents !== '') { - $phpcs->processFile('STDIN', $fileContents); - } + $phpcs->processFile('STDIN', $fileContents); } } @@ -1051,7 +1116,7 @@ public function validateStandard($standards) $standard = 'PEAR'; } - return array($standard); + return explode(',', $standard); }//end if $cleaned = array(); @@ -1185,12 +1250,12 @@ public function printUsage() */ public function printPHPCSUsage() { - echo 'Usage: phpcs [-nwlsaepvi] [-d key[=value]] [--colors] [--no-colors]'.PHP_EOL; + echo 'Usage: phpcs [-nwlsaepqvi] [-d key[=value]] [--colors] [--no-colors] [--stdin-path=]'.PHP_EOL; echo ' [--report=] [--report-file=] [--report-=] ...'.PHP_EOL; echo ' [--report-width=] [--generator=] [--tab-width=]'.PHP_EOL; echo ' [--severity=] [--error-severity=] [--warning-severity=]'.PHP_EOL; echo ' [--runtime-set key value] [--config-set key value] [--config-delete key] [--config-show]'.PHP_EOL; - echo ' [--standard=] [--sniffs=] [--encoding=]'.PHP_EOL; + echo ' [--standard=] [--sniffs=] [--exclude=] [--encoding=]'.PHP_EOL; echo ' [--extensions=] [--ignore=] [--bootstrap=] ...'.PHP_EOL; echo ' Set runtime value (see --config-set) '.PHP_EOL; echo ' -n Do not print warnings (shortcut for --warning-severity=0)'.PHP_EOL; @@ -1200,6 +1265,7 @@ public function printPHPCSUsage() echo ' -a Run interactively'.PHP_EOL; echo ' -e Explain a standard by showing the sniffs it includes'.PHP_EOL; echo ' -p Show progress of the run'.PHP_EOL; + echo ' -q Quiet mode; disables progress and verbose output'.PHP_EOL; echo ' -v[v][v] Print verbose output'.PHP_EOL; echo ' -i Show a list of installed coding standards'.PHP_EOL; echo ' -d Set the [key] php.ini value to [value] or [true] if value is omitted'.PHP_EOL; @@ -1208,23 +1274,24 @@ public function printPHPCSUsage() echo ' --colors Use colors in output'.PHP_EOL; echo ' --no-colors Do not use colors in output (this is the default)'.PHP_EOL; echo ' One or more files and/or directories to check'.PHP_EOL; + echo ' If processing STDIN, the file path that STDIN will be processed as '.PHP_EOL; echo ' A comma separated list of files to run before processing starts'.PHP_EOL; echo ' The encoding of the files being checked (default is iso-8859-1)'.PHP_EOL; echo ' A comma separated list of file extensions to check'.PHP_EOL; echo ' (extension filtering only valid when checking a directory)'.PHP_EOL; echo ' The type of the file can be specified using: ext/type'.PHP_EOL; echo ' e.g., module/php,es/js'.PHP_EOL; - echo ' Uses either the "HMTL", "Markdown" or "Text" generator'.PHP_EOL; + echo ' Uses either the "HTML", "Markdown" or "Text" generator'.PHP_EOL; echo ' (forces documentation generation instead of checking)'.PHP_EOL; echo ' A comma separated list of patterns to ignore files and directories'.PHP_EOL; echo ' Print either the "full", "xml", "checkstyle", "csv"'.PHP_EOL; - echo ' "json", "emacs", "source", "summary", "diff"'.PHP_EOL; + echo ' "json", "emacs", "source", "summary", "diff", "junit"'.PHP_EOL; echo ' "svnblame", "gitblame", "hgblame" or "notifysend" report'.PHP_EOL; echo ' (the "full" report is printed by default)'.PHP_EOL; echo ' Write the report to the specified file path'.PHP_EOL; echo ' How many columns wide screen reports should be printed'.PHP_EOL; echo ' or set to "auto" to use current screen width, where supported'.PHP_EOL; - echo ' A comma separated list of sniff codes to limit the check to'.PHP_EOL; + echo ' A comma separated list of sniff codes to include or exclude during checking'.PHP_EOL; echo ' (all sniffs must be part of the specified standard)'.PHP_EOL; echo ' The minimum severity required to display an error or warning'.PHP_EOL; echo ' The name or path of the coding standard to use'.PHP_EOL; @@ -1240,8 +1307,8 @@ public function printPHPCSUsage() */ public function printPHPCBFUsage() { - echo 'Usage: phpcbf [-nwli] [-d key[=value]]'.PHP_EOL; - echo ' [--standard=] [--sniffs=] [--suffix=]'.PHP_EOL; + echo 'Usage: phpcbf [-nwli] [-d key[=value]] [--stdin-path=]'.PHP_EOL; + echo ' [--standard=] [--sniffs=] [--exclude=] [--suffix=]'.PHP_EOL; echo ' [--severity=] [--error-severity=] [--warning-severity=]'.PHP_EOL; echo ' [--tab-width=] [--encoding=]'.PHP_EOL; echo ' [--extensions=] [--ignore=] [--bootstrap=] ...'.PHP_EOL; @@ -1254,6 +1321,7 @@ public function printPHPCBFUsage() echo ' --version Print version information'.PHP_EOL; echo ' --no-patch Do not make use of the "diff" or "patch" programs'.PHP_EOL; echo ' One or more files and/or directories to fix'.PHP_EOL; + echo ' If processing STDIN, the file path that STDIN will be processed as '.PHP_EOL; echo ' A comma separated list of files to run before processing starts'.PHP_EOL; echo ' The encoding of the files being fixed (default is iso-8859-1)'.PHP_EOL; echo ' A comma separated list of file extensions to fix'.PHP_EOL; @@ -1261,7 +1329,7 @@ public function printPHPCBFUsage() echo ' The type of the file can be specified using: ext/type'.PHP_EOL; echo ' e.g., module/php,es/js'.PHP_EOL; echo ' A comma separated list of patterns to ignore files and directories'.PHP_EOL; - echo ' A comma separated list of sniff codes to limit the fixes to'.PHP_EOL; + echo ' A comma separated list of sniff codes to include or exclude during fixing'.PHP_EOL; echo ' (all sniffs must be part of the specified standard)'.PHP_EOL; echo ' The minimum severity required to fix an error or warning'.PHP_EOL; echo ' The name or path of the coding standard to use'.PHP_EOL; @@ -1304,7 +1372,7 @@ public function printInstalledStandards() * @param int $width The width of the report. If "auto" then will * be replaced by the terminal width. * - * @return void + * @return int */ private function _validateReportWidth($width) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/File.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/File.php index 4f1a2975..36cc44f8 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/File.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/File.php @@ -459,8 +459,11 @@ public function start($contents=null) // If this is standard input, see if a filename was passed in as well. // This is done by including: phpcs_input_file: [file path] // as the first line of content. - if ($this->_file === 'STDIN' && $contents !== null) { - if (substr($contents, 0, 17) === 'phpcs_input_file:') { + if ($this->_file === 'STDIN') { + $cliValues = $this->phpcs->cli->getCommandLineValues(); + if ($cliValues['stdinPath'] !== '') { + $this->_file = $cliValues['stdinPath']; + } else if ($contents !== null && substr($contents, 0, 17) === 'phpcs_input_file:') { $eolPos = strpos($contents, $this->eolChar); $filename = trim(substr($contents, 17, ($eolPos - 17))); $contents = substr($contents, ($eolPos + strlen($this->eolChar))); @@ -498,12 +501,15 @@ public function start($contents=null) $this->_fixableCount = 0; return; } else if (strpos($token['content'], '@codingStandardsChangeSetting') !== false) { - $start = strpos($token['content'], '@codingStandardsChangeSetting'); - $comment = substr($token['content'], ($start + 30)); - $parts = explode(' ', $comment); - $sniffParts = explode('.', $parts[0]); - $listenerClass = $sniffParts[0].'_Sniffs_'.$sniffParts[1].'_'.$sniffParts[2].'Sniff'; - $this->phpcs->setSniffProperty($listenerClass, $parts[1], $parts[2]); + $start = strpos($token['content'], '@codingStandardsChangeSetting'); + $comment = substr($token['content'], ($start + 30)); + $parts = explode(' ', $comment); + if (count($parts) >= 3 + && isset($this->phpcs->sniffCodes[$parts[0]]) === true + ) { + $listenerClass = $this->phpcs->sniffCodes[$parts[0]]; + $this->phpcs->setSniffProperty($listenerClass, $parts[1], $parts[2]); + } }//end if }//end if }//end if @@ -861,8 +867,8 @@ public function addWarning( * @param int $line The line on which the error occurred. * @param string $code A violation code unique to the sniff message. * @param array $data Replacements for the error message. - * @param int $severity The severity level for this error. A value of 0 will be converted into the default severity level. - * will be converted into the default severity level. + * @param int $severity The severity level for this error. A value of 0 + * will be converted into the default severity level. * * @return boolean */ @@ -885,8 +891,8 @@ public function addErrorOnLine( * @param int $line The line on which the warning occurred. * @param string $code A violation code unique to the sniff message. * @param array $data Replacements for the warning message. - * @param int $severity The severity level for this warning. A value of 0 will be converted into the default severity level. - * will be converted into the default severity level. + * @param int $severity The severity level for this warning. A value of 0 + * will be converted into the default severity level. * * @return boolean */ @@ -987,7 +993,6 @@ private function _addError($error, $line, $column, $code, $data, $severity, $fix // Work out which sniff generated the error. if (substr($code, 0, 9) === 'Internal.') { // Any internal message. - $sniff = $code; $sniffCode = $code; } else { $parts = explode('_', str_replace('\\', '_', $this->_activeListener)); @@ -1135,7 +1140,6 @@ private function _addWarning($warning, $line, $column, $code, $data, $severity, // Work out which sniff generated the warning. if (substr($code, 0, 9) === 'Internal.') { // Any internal message. - $sniff = $code; $sniffCode = $code; } else { $parts = explode('_', str_replace('\\', '_', $this->_activeListener)); @@ -1417,7 +1421,9 @@ public static function tokenizeString($string, $tokenizer, $eolChar='\n', $tabWi { // Minified files often have a very large number of characters per line // and cause issues when tokenizing. - if (get_class($tokenizer) !== 'PHP_CodeSniffer_Tokenizers_PHP') { + if (property_exists($tokenizer, 'skipMinified') === true + && $tokenizer->skipMinified === true + ) { $numChars = strlen($string); $numLines = (substr_count($string, $eolChar) + 1); $average = ($numChars / $numLines); @@ -1755,6 +1761,13 @@ private static function _createTokenMap(&$tokens, $tokenizer, $eolChar) }//end switch }//end for + // Cleanup for any openers that we didn't find closers for. + // This typically means there was a syntax error breaking things. + foreach ($openers as $opener) { + unset($tokens[$opener]['parenthesis_opener']); + unset($tokens[$opener]['parenthesis_owner']); + } + if (PHP_CODESNIFFER_VERBOSITY > 1) { echo "\t*** END TOKEN MAP ***".PHP_EOL; } @@ -1821,10 +1834,6 @@ private static function _createScopeMap(&$tokens, $tokenizer, $eolChar) { if (PHP_CODESNIFFER_VERBOSITY > 1) { echo "\t*** START SCOPE MAP ***".PHP_EOL; - $isWin = false; - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $isWin = true; - } } $numTokens = count($tokens); @@ -1888,11 +1897,6 @@ private static function _recurseScopeMap( if (PHP_CODESNIFFER_VERBOSITY > 1) { echo str_repeat("\t", $depth); echo "=> Begin scope map recursion at token $stackPtr with depth $depth".PHP_EOL; - - $isWin = false; - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $isWin = true; - } } $opener = null; @@ -1948,6 +1952,20 @@ private static function _recurseScopeMap( return $i; } + if ($opener === null + && $ignore === 0 + && $tokenType === T_CLOSE_CURLY_BRACKET + && isset($tokenizer->scopeOpeners[$currType]['end'][$tokenType]) === true + ) { + if (PHP_CODESNIFFER_VERBOSITY > 1) { + $type = $tokens[$stackPtr]['type']; + echo str_repeat("\t", $depth); + echo "=> Found curly brace closer before scope opener for $stackPtr:$type, bailing".PHP_EOL; + } + + return ($i - 1); + } + if ($opener !== null && (isset($tokens[$i]['scope_opener']) === false || $tokenizer->scopeOpeners[$tokens[$stackPtr]['code']]['shared'] === true) @@ -2113,10 +2131,27 @@ private static function _recurseScopeMap( if (PHP_CODESNIFFER_VERBOSITY > 1) { $type = $tokens[$stackPtr]['type']; echo str_repeat("\t", $depth); - echo "=> Found new opening condition before scope opener for $stackPtr:$type, bailing".PHP_EOL; + echo "=> Found new opening condition before scope opener for $stackPtr:$type, "; } - return $stackPtr; + if (($tokens[$stackPtr]['code'] === T_IF + || $tokens[$stackPtr]['code'] === T_ELSEIF + || $tokens[$stackPtr]['code'] === T_ELSE) + && ($tokens[$i]['code'] === T_ELSE + || $tokens[$i]['code'] === T_ELSEIF) + ) { + if (PHP_CODESNIFFER_VERBOSITY > 1) { + echo "continuing".PHP_EOL; + } + + return ($i - 1); + } else { + if (PHP_CODESNIFFER_VERBOSITY > 1) { + echo "backtracking".PHP_EOL; + } + + return $stackPtr; + } }//end if if (PHP_CODESNIFFER_VERBOSITY > 1) { @@ -3213,9 +3248,9 @@ public function getTokensAsString($start, $length) /** - * Returns the position of the next specified token(s). + * Returns the position of the previous specified token(s). * - * If a value is specified, the next token of the specified type(s) + * If a value is specified, the previous token of the specified type(s) * containing the specified value will be returned. * * Returns false if no token can be found. @@ -3226,14 +3261,14 @@ public function getTokensAsString($start, $length) * @param int $end The end position to fail if no token is found. * if not specified or null, end will default to * the start of the token stack. - * @param bool $exclude If true, find the next token that are NOT of + * @param bool $exclude If true, find the previous token that are NOT of * the types specified in $types. * @param string $value The value that the token(s) must be equal to. * If value is omitted, tokens with any value will * be returned. * @param bool $local If true, tokens outside the current statement * will not be checked. IE. checking will stop - * at the next semi-colon found. + * at the previous semi-colon found. * * @return int|bool * @see findNext() @@ -3363,11 +3398,12 @@ public function findNext( /** * Returns the position of the first non-whitespace token in a statement. * - * @param int $start The position to start searching from in the token stack. + * @param int $start The position to start searching from in the token stack. + * @param int|array $ignore Token types that should not be considered stop points. * * @return int */ - public function findStartOfStatement($start) + public function findStartOfStatement($start, $ignore=null) { $endTokens = PHP_CodeSniffer_Tokens::$blockOpeners; @@ -3379,6 +3415,15 @@ public function findStartOfStatement($start) $endTokens[T_CLOSE_TAG] = true; $endTokens[T_OPEN_SHORT_ARRAY] = true; + if ($ignore !== null) { + $ignore = (array) $ignore; + foreach ($ignore as $code) { + if (isset($endTokens[$code]) === true) { + unset($endTokens[$code]); + } + } + } + $lastNotEmpty = $start; for ($i = $start; $i >= 0; $i--) { @@ -3418,11 +3463,12 @@ public function findStartOfStatement($start) /** * Returns the position of the last non-whitespace token in a statement. * - * @param int $start The position to start searching from in the token stack. + * @param int $start The position to start searching from in the token stack. + * @param int|array $ignore Token types that should not be considered stop points. * * @return int */ - public function findEndOfStatement($start) + public function findEndOfStatement($start, $ignore=null) { $endTokens = array( T_COLON => true, @@ -3437,6 +3483,15 @@ public function findEndOfStatement($start) T_CLOSE_TAG => true, ); + if ($ignore !== null) { + $ignore = (array) $ignore; + foreach ($ignore as $code) { + if (isset($endTokens[$code]) === true) { + unset($endTokens[$code]); + } + } + } + $lastNotEmpty = $start; for ($i = $start; $i < $this->numTokens; $i++) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Fixer.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Fixer.php index 4131fd88..9954255d 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Fixer.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Fixer.php @@ -427,6 +427,41 @@ public function endChangeset() }//end endChangeset() + /** + * Stop recording actions for a changeset, and discard logged changes. + * + * @return void + */ + public function rollbackChangeset() + { + $this->_inChangeset = false; + $this->_inConflict = false; + + if (empty($this->_changeset) === false) { + if (PHP_CODESNIFFER_VERBOSITY > 1) { + $bt = debug_backtrace(); + if ($bt[1]['class'] === 'PHP_CodeSniffer_Fixer') { + $sniff = $bt[2]['class']; + $line = $bt[1]['line']; + } else { + $sniff = $bt[1]['class']; + $line = $bt[0]['line']; + } + + $numChanges = count($this->_changeset); + + @ob_end_clean(); + echo "\t\tR: $sniff (line $line) rolled back the changeset ($numChanges changes)".PHP_EOL; + echo "\t=> Changeset rolled back".PHP_EOL; + ob_start(); + } + + $this->_changeset = array(); + }//end if + + }//end rollbackChangeset() + + /** * Replace the entire contents of a token. * diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/VersionControl.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/VersionControl.php index 6342848d..80c51b22 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/VersionControl.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Reports/VersionControl.php @@ -107,9 +107,12 @@ public function generateFileReport( if ($showSources === true) { $source = $error['source']; if (isset($this->_sourceCache[$author][$source]) === false) { - $this->_sourceCache[$author][$source] = 1; + $this->_sourceCache[$author][$source] = array( + 'count' => 1, + 'fixable' => $error['fixable'], + ); } else { - $this->_sourceCache[$author][$source]++; + $this->_sourceCache[$author][$source]['count']++; } } } @@ -183,7 +186,7 @@ public function generate( foreach ($this->_authorCache as $author => $count) { $maxLength = max($maxLength, strlen($author)); if ($showSources === true && isset($this->_sourceCache[$author]) === true) { - foreach ($this->_sourceCache[$author] as $source => $count) { + foreach ($this->_sourceCache[$author] as $source => $sourceData) { if ($source === 'count') { continue; } @@ -209,6 +212,16 @@ public function generate( echo "\033[0m"; + if ($showSources === true) { + $maxSniffWidth = ($width - 15); + + if ($totalFixable > 0) { + $maxSniffWidth -= 4; + } + } + + $fixableSources = 0; + foreach ($this->_authorCache as $author => $count) { if ($this->_praiseCache[$author]['good'] === 0) { $percent = 0; @@ -235,15 +248,43 @@ public function generate( asort($errors); $errors = array_reverse($errors); - foreach ($errors as $source => $count) { + foreach ($errors as $source => $sourceData) { if ($source === 'count') { continue; } + $count = $sourceData['count']; + + $srcLength = strlen($source); + if ($srcLength > $maxSniffWidth) { + $source = substr($source, 0, $maxSniffWidth); + } + $line = str_repeat(' ', (5 - strlen($count))).$count; - echo ' '.$source.str_repeat(' ', ($width - 14 - strlen($source))).$line.PHP_EOL; - } - } + + echo ' '; + if ($totalFixable > 0) { + echo '['; + if ($sourceData['fixable'] === true) { + echo 'x'; + $fixableSources++; + } else { + echo ' '; + } + + echo '] '; + } + + echo $source; + if ($totalFixable > 0) { + echo str_repeat(' ', ($width - 18 - strlen($source))); + } else { + echo str_repeat(' ', ($width - 14 - strlen($source))); + } + + echo $line.PHP_EOL; + }//end foreach + }//end if }//end foreach echo str_repeat('-', $width).PHP_EOL; @@ -260,8 +301,13 @@ public function generate( echo "\033[0m"; if ($totalFixable > 0) { - echo PHP_EOL.str_repeat('-', $width).PHP_EOL; - echo "\033[1mPHPCBF CAN FIX $totalFixable OF THESE SNIFF VIOLATIONS AUTOMATICALLY\033[0m"; + if ($showSources === true) { + echo PHP_EOL.str_repeat('-', $width).PHP_EOL; + echo "\033[1mPHPCBF CAN FIX THE $fixableSources MARKED SOURCES AUTOMATICALLY ($totalFixable VIOLATIONS IN TOTAL)\033[0m"; + } else { + echo PHP_EOL.str_repeat('-', $width).PHP_EOL; + echo "\033[1mPHPCBF CAN FIX $totalFixable OF THESE SNIFF VIOLATIONS AUTOMATICALLY\033[0m"; + } } echo PHP_EOL.str_repeat('-', $width).PHP_EOL.PHP_EOL; diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php index 53388d3c..913789c9 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php @@ -134,107 +134,121 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $phpcsFile->recordMetric($stackPtr, 'Control structure defined inline', 'yes'); - if ($fix === true) { - $phpcsFile->fixer->beginChangeset(); - if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { - $closer = $tokens[$stackPtr]['parenthesis_closer']; - } else { - $closer = $stackPtr; + // Stop here if we are not fixing the error. + if ($fix !== true) { + return; + } + + $phpcsFile->fixer->beginChangeset(); + if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) { + $closer = $tokens[$stackPtr]['parenthesis_closer']; + } else { + $closer = $stackPtr; + } + + if ($tokens[($closer + 1)]['code'] === T_WHITESPACE + || $tokens[($closer + 1)]['code'] === T_SEMICOLON + ) { + $phpcsFile->fixer->addContent($closer, ' {'); + } else { + $phpcsFile->fixer->addContent($closer, ' { '); + } + + $fixableScopeOpeners = $this->register(); + + $lastNonEmpty = $closer; + for ($end = ($closer + 1); $end < $phpcsFile->numTokens; $end++) { + if ($tokens[$end]['code'] === T_SEMICOLON) { + break; } - if ($tokens[($closer + 1)]['code'] === T_WHITESPACE - || $tokens[($closer + 1)]['code'] === T_SEMICOLON + if ($tokens[$end]['code'] === T_CLOSE_TAG) { + $end = $lastNonEmpty; + break; + } + + if (in_array($tokens[$end]['code'], $fixableScopeOpeners) === true + && isset($tokens[$end]['scope_opener']) === false ) { - $phpcsFile->fixer->addContent($closer, ' {'); - } else { - $phpcsFile->fixer->addContent($closer, ' { '); + // The best way to fix nested inline scopes is middle-out. + // So skip this one. It will be detected and fixed on a future loop. + $phpcsFile->fixer->rollbackChangeset(); + return; } - $lastNonEmpty = $closer; - for ($end = ($closer + 1); $end < $phpcsFile->numTokens; $end++) { - if ($tokens[$end]['code'] === T_SEMICOLON) { - break; - } + if (isset($tokens[$end]['scope_opener']) === true) { + $type = $tokens[$end]['code']; + $end = $tokens[$end]['scope_closer']; + if ($type === T_DO || $type === T_IF || $type === T_ELSEIF) { + $next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($end + 1), null, true); + if ($next === false) { + break; + } - if ($tokens[$end]['code'] === T_CLOSE_TAG) { - $end = $lastNonEmpty; - break; - } + $nextType = $tokens[$next]['code']; - if (isset($tokens[$end]['scope_opener']) === true) { - $type = $tokens[$end]['code']; - $end = $tokens[$end]['scope_closer']; - if ($type === T_DO || $type === T_IF || $type === T_ELSEIF) { - $next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($end + 1), null, true); - if ($next === false) { - break; - } - - $nextType = $tokens[$next]['code']; - - // Let additional conditions loop and find their ending. - if (($type === T_IF - || $type === T_ELSEIF) - && ($nextType === T_ELSEIF - || $nextType === T_ELSE) - ) { - continue; - } - - // Account for DO... WHILE conditions. - if ($type === T_DO && $nextType === T_WHILE) { - $end = $phpcsFile->findNext(T_SEMICOLON, ($next + 1)); - } - }//end if - - break; - }//end if + // Let additional conditions loop and find their ending. + if (($type === T_IF + || $type === T_ELSEIF) + && ($nextType === T_ELSEIF + || $nextType === T_ELSE) + ) { + continue; + } - if ($tokens[$end]['code'] !== T_WHITESPACE) { - $lastNonEmpty = $end; - } - }//end for + // Account for DO... WHILE conditions. + if ($type === T_DO && $nextType === T_WHILE) { + $end = $phpcsFile->findNext(T_SEMICOLON, ($next + 1)); + } + }//end if - $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), ($end + 1), true); + break; + }//end if - // Account for a comment on the end of the line. - for ($endLine = $end; $endLine < $phpcsFile->numTokens; $endLine++) { - if (isset($tokens[($endLine + 1)]) === false - || $tokens[$endLine]['line'] !== $tokens[($endLine + 1)]['line'] - ) { - break; - } + if ($tokens[$end]['code'] !== T_WHITESPACE) { + $lastNonEmpty = $end; } + }//end for + + $next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), ($end + 1), true); - if ($tokens[$endLine]['code'] !== T_COMMENT) { - $endLine = $end; + // Account for a comment on the end of the line. + for ($endLine = $end; $endLine < $phpcsFile->numTokens; $endLine++) { + if (isset($tokens[($endLine + 1)]) === false + || $tokens[$endLine]['line'] !== $tokens[($endLine + 1)]['line'] + ) { + break; } + } - if ($next !== $end) { - if ($endLine !== $end) { - $phpcsFile->fixer->addContent($endLine, '}'); - } else { - if ($tokens[$end]['code'] !== T_SEMICOLON - && $tokens[$end]['code'] !== T_CLOSE_CURLY_BRACKET - ) { - $phpcsFile->fixer->addContent($end, ';'); - } + if ($tokens[$endLine]['code'] !== T_COMMENT) { + $endLine = $end; + } - $phpcsFile->fixer->addContent($end, ' }'); - } + if ($next !== $end) { + if ($endLine !== $end) { + $phpcsFile->fixer->addContent($endLine, '}'); } else { - if ($endLine !== $end) { - $phpcsFile->fixer->replaceToken($end, ''); - $phpcsFile->fixer->addNewlineBefore($endLine); - $phpcsFile->fixer->addContent($endLine, '}'); - } else { - $phpcsFile->fixer->replaceToken($end, '}'); + if ($tokens[$end]['code'] !== T_SEMICOLON + && $tokens[$end]['code'] !== T_CLOSE_CURLY_BRACKET + ) { + $phpcsFile->fixer->addContent($end, ';'); } - }//end if - $phpcsFile->fixer->endChangeset(); + $phpcsFile->fixer->addContent($end, ' }'); + } + } else { + if ($endLine !== $end) { + $phpcsFile->fixer->replaceToken($end, ''); + $phpcsFile->fixer->addNewlineBefore($endLine); + $phpcsFile->fixer->addContent($endLine, '}'); + } else { + $phpcsFile->fixer->replaceToken($end, '}'); + } }//end if + $phpcsFile->fixer->endChangeset(); + }//end process() diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineLengthSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineLengthSniff.php index 50d97780..d64c2add 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineLengthSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Files/LineLengthSniff.php @@ -127,6 +127,30 @@ protected function checkLineLength(PHP_CodeSniffer_File $phpcsFile, $tokens, $st $phpcsFile->recordMetric($stackPtr, 'Line length', '151 or more'); } + // If this is a long comment, check if it can be broken up onto multiple lines. + // Some comments contain unbreakable strings like URLs and so it makes sense + // to ignore the line length in these cases if the URL would be longer than the max + // line length once you indent it to the correct level. + if ($lineLength > $this->lineLimit + && ($tokens[$stackPtr]['code'] === T_COMMENT + || $tokens[$stackPtr]['code'] === T_DOC_COMMENT_STRING) + ) { + $oldLength = strlen($tokens[$stackPtr]['content']); + $newLength = strlen(ltrim($tokens[$stackPtr]['content'], "/#\t ")); + $indent = (($tokens[$stackPtr]['column'] - 1) + ($oldLength - $newLength)); + + $nonBreakingLength = $tokens[$stackPtr]['length']; + + $space = strrpos($tokens[$stackPtr]['content'], ' '); + if ($space !== false) { + $nonBreakingLength -= ($space + 1); + } + + if (($nonBreakingLength + $indent) > $this->lineLimit) { + return; + } + } + if ($this->absoluteLineLimit > 0 && $lineLength > $this->absoluteLineLimit ) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php index 837e8e1b..7d958dde 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php @@ -257,6 +257,8 @@ public function checkAlignment(PHP_CodeSniffer_File $phpcsFile, $stackPtr) return $stackPtr; } + $numAssignments = count($assignments); + $errorGenerated = false; foreach ($assignments as $assignment => $data) { if ($data['found'] === $data['expected']) { @@ -277,7 +279,7 @@ public function checkAlignment(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } } - if (count($assignments) === 1) { + if ($numAssignments === 1) { $type = 'Incorrect'; $error = 'Equals sign not aligned correctly; expected %s but found %s'; } else { @@ -308,10 +310,12 @@ public function checkAlignment(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } }//end foreach - if ($errorGenerated === true) { - $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'no'); - } else { - $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'yes'); + if ($numAssignments > 1) { + if ($errorGenerated === true) { + $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'no'); + } else { + $phpcsFile->recordMetric($stackPtr, 'Adjacent assignments aligned', 'yes'); + } } if ($stopped !== null) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php new file mode 100644 index 00000000..3620926e --- /dev/null +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Formatting/SpaceAfterNotSniff.php @@ -0,0 +1,90 @@ + + * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) + * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence + * @link http://pear.php.net/package/PHP_CodeSniffer + */ + +/** + * Generic_Sniffs_Formatting_SpaceAfterNotSniff. + * + * Ensures there is a single space after a NOT operator. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Greg Sherwood + * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) + * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHP_CodeSniffer + */ +class Generic_Sniffs_Formatting_SpaceAfterNotSniff implements PHP_CodeSniffer_Sniff +{ + + /** + * A list of tokenizers this sniff supports. + * + * @var array + */ + public $supportedTokenizers = array( + 'PHP', + 'JS', + ); + + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array(T_BOOLEAN_NOT); + + }//end register() + + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile All the tokens found in the document. + * @param int $stackPtr The position of the current token in + * the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + + $spacing = 0; + if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) { + $spacing = $tokens[($stackPtr + 1)]['length']; + } + + if ($spacing === 1) { + return; + } + + $message = 'There must be a single space after a NOT operator; %s found'; + $fix = $phpcsFile->addFixableError($message, $stackPtr, 'Incorrect', array($spacing)); + + if ($fix === true) { + if ($spacing === 0) { + $phpcsFile->fixer->addContent($stackPtr, ' '); + } else { + $phpcsFile->fixer->replaceToken(($stackPtr + 1), ' '); + } + } + + }//end process() + + +}//end class diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php index 3e1f6b2b..b949a0dc 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/CallTimePassByReferenceSniff.php @@ -68,12 +68,8 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) // within their definitions. For example: function myFunction... // "myFunction" is T_STRING but we should skip because it is not a // function or method *call*. - // Also skip if the return value is being assigned to a variable. $prevCode = $tokens[$prev]['code']; - if ($prevCode === T_FUNCTION - || $prevCode === T_CLASS - || isset(PHP_CodeSniffer_Tokens::$assignmentTokens[$prevCode]) === true - ) { + if ($prevCode === T_FUNCTION || $prevCode === T_CLASS) { return; } @@ -98,11 +94,21 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $closeBracket = $tokens[$openBracket]['parenthesis_closer']; $nextSeparator = $openBracket; - while (($nextSeparator = $phpcsFile->findNext(T_VARIABLE, ($nextSeparator + 1), $closeBracket)) !== false) { + $find = array( + T_VARIABLE, + T_OPEN_SHORT_ARRAY, + ); + + while (($nextSeparator = $phpcsFile->findNext($find, ($nextSeparator + 1), $closeBracket)) !== false) { if (isset($tokens[$nextSeparator]['nested_parenthesis']) === false) { continue; } + if ($tokens[$nextSeparator]['code'] === T_OPEN_SHORT_ARRAY) { + $nextSeparator = $tokens[$nextSeparator]['bracket_closer']; + continue; + } + // Make sure the variable belongs directly to this function call // and is not inside a nested function call or array. $brackets = $tokens[$nextSeparator]['nested_parenthesis']; @@ -134,6 +140,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $tokenCode = $tokens[$tokenBefore]['code']; if ($tokenCode === T_VARIABLE || $tokenCode === T_CLOSE_PARENTHESIS + || $tokenCode === T_CLOSE_SQUARE_BRACKET || $tokenCode === T_LNUMBER || isset(PHP_CodeSniffer_Tokens::$assignmentTokens[$tokenCode]) === true ) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php index d05b1a10..e5acafa7 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/Functions/OpeningFunctionBraceKernighanRitchieSniff.php @@ -107,8 +107,9 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $error = 'Opening brace should be on the same line as the declaration'; $fix = $phpcsFile->addFixableError($error, $openingBrace, 'BraceOnNewLine'); if ($fix === true) { + $prev = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, ($openingBrace - 1), $closeBracket, true); $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addContent($closeBracket, ' {'); + $phpcsFile->fixer->addContent($prev, ' {'); $phpcsFile->fixer->replaceToken($openingBrace, ''); $phpcsFile->fixer->endChangeset(); } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SyntaxSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SyntaxSniff.php index 1bb0b826..407d514c 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SyntaxSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/PHP/SyntaxSniff.php @@ -56,7 +56,12 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { $phpPath = PHP_CodeSniffer::getConfigData('php_path'); if ($phpPath === null) { - return; + // PHP_BINARY is available in PHP 5.4+. + if (defined('PHP_BINARY') === true) { + $phpPath = PHP_BINARY; + } else { + return; + } } $fileName = $phpcsFile->getFilename(); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php index 19c6eb8b..7359cc23 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowSpaceIndentSniff.php @@ -84,6 +84,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $checkTokens = array( T_WHITESPACE => true, + T_INLINE_HTML => true, T_DOC_COMMENT_WHITESPACE => true, ); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php index 57af8330..4d793239 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/DisallowTabIndentSniff.php @@ -71,6 +71,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $checkTokens = array( T_WHITESPACE => true, + T_INLINE_HTML => true, T_DOC_COMMENT_WHITESPACE => true, T_DOC_COMMENT_STRING => true, ); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php index 5a43dc2d..f7ddf2dd 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Generic/Sniffs/WhiteSpace/ScopeIndentSniff.php @@ -163,6 +163,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $lastCloseTag = null; $openScopes = array(); $adjustments = array(); + $setIndents = array(); $tokens = $phpcsFile->getTokens(); $first = $phpcsFile->findFirstOnLine(T_INLINE_HTML, $stackPtr); @@ -252,81 +253,146 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $parenOpener = $tokens[$parenCloser]['parenthesis_opener']; if ($tokens[$parenCloser]['line'] !== $tokens[$parenOpener]['line']) { - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $parenOpener, true); - $checkIndent = ($tokens[$first]['column'] - 1); - if (isset($adjustments[$first]) === true) { - $checkIndent += $adjustments[$first]; + $parens = 0; + if (isset($tokens[$parenCloser]['nested_parenthesis']) === true + && empty($tokens[$parenCloser]['nested_parenthesis']) === false + ) { + end($tokens[$parenCloser]['nested_parenthesis']); + $parens = key($tokens[$parenCloser]['nested_parenthesis']); + if ($this->_debug === true) { + $line = $tokens[$parens]['line']; + echo "\t* token has nested parenthesis $parens on line $line *".PHP_EOL; + } } - $exact = false; - - if ($this->_debug === true) { - $line = $tokens[$first]['line']; - $type = $tokens[$first]['type']; - echo "\t* first token on line $line is $type *".PHP_EOL; + $condition = 0; + if (isset($tokens[$parenCloser]['conditions']) === true + && empty($tokens[$parenCloser]['conditions']) === false + ) { + end($tokens[$parenCloser]['conditions']); + $condition = key($tokens[$parenCloser]['conditions']); + if ($this->_debug === true) { + $line = $tokens[$condition]['line']; + $type = $tokens[$condition]['type']; + echo "\t* token is inside condition $condition ($type) on line $line *".PHP_EOL; + } } - if ($first === $tokens[$parenCloser]['parenthesis_opener']) { - // This is unlikely to be the start of the statement, so look - // back further to find it. - $first--; + if ($parens > $condition) { + if ($this->_debug === true) { + echo "\t* using parenthesis *".PHP_EOL; + } + + $parenOpener = $parens; + $condition = 0; + } else if ($condition > 0) { + if ($this->_debug === true) { + echo "\t* using condition *".PHP_EOL; + } + + $parenOpener = $condition; + $parens = 0; } - $prev = $phpcsFile->findStartOfStatement($first); - if ($prev !== $first) { - // This is not the start of the statement. + $exact = false; + + if ($condition > 0 + && isset($tokens[$condition]['scope_opener']) === true + && isset($setIndents[$tokens[$condition]['scope_opener']]) === true + ) { + $checkIndent = $setIndents[$tokens[$condition]['scope_opener']]; + if (isset($adjustments[$condition]) === true) { + $checkIndent += $adjustments[$condition]; + } + + $currentIndent = $checkIndent; + if ($this->_debug === true) { - $line = $tokens[$prev]['line']; - $type = $tokens[$prev]['type']; - echo "\t* previous is $type on line $line *".PHP_EOL; + $type = $tokens[$condition]['type']; + echo "\t=> checking indent of $checkIndent; main indent set to $currentIndent by token $condition ($type)".PHP_EOL; + } + } else { + $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $parenOpener, true); + + $checkIndent = ($tokens[$first]['column'] - 1); + if (isset($adjustments[$first]) === true) { + $checkIndent += $adjustments[$first]; } - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $prev, true); - $prev = $phpcsFile->findStartOfStatement($first); - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $prev, true); if ($this->_debug === true) { $line = $tokens[$first]['line']; $type = $tokens[$first]['type']; - echo "\t* amended first token is $type on line $line *".PHP_EOL; + echo "\t* first token on line $line is $first ($type) *".PHP_EOL; } - } - if (isset($tokens[$first]['scope_closer']) === true - && $tokens[$first]['scope_closer'] === $first - ) { - if ($this->_debug === true) { - echo "\t* first token is a scope closer *".PHP_EOL; + if ($first === $tokens[$parenCloser]['parenthesis_opener']) { + // This is unlikely to be the start of the statement, so look + // back further to find it. + $first--; } - if (isset($tokens[$first]['scope_condition']) === true) { - $scopeCloser = $first; - $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $tokens[$scopeCloser]['scope_condition'], true); + $prev = $phpcsFile->findStartOfStatement($first, T_COMMA); + if ($prev !== $first) { + // This is not the start of the statement. + if ($this->_debug === true) { + $line = $tokens[$prev]['line']; + $type = $tokens[$prev]['type']; + echo "\t* previous is $type on line $line *".PHP_EOL; + } + $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $prev, true); + $prev = $phpcsFile->findStartOfStatement($first, T_COMMA); + $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $prev, true); + if ($this->_debug === true) { + $line = $tokens[$first]['line']; + $type = $tokens[$first]['type']; + echo "\t* amended first token is $first ($type) on line $line *".PHP_EOL; + } + } + + if (isset($tokens[$first]['scope_closer']) === true + && $tokens[$first]['scope_closer'] === $first + ) { + if ($this->_debug === true) { + echo "\t* first token is a scope closer *".PHP_EOL; + } + + if (isset($tokens[$first]['scope_condition']) === true) { + $scopeCloser = $first; + $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $tokens[$scopeCloser]['scope_condition'], true); + + $currentIndent = ($tokens[$first]['column'] - 1); + if (isset($adjustments[$first]) === true) { + $currentIndent += $adjustments[$first]; + } + + // Make sure it is divisible by our expected indent. + if ($tokens[$tokens[$scopeCloser]['scope_condition']]['code'] !== T_CLOSURE) { + $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + } + + $setIndents[$first] = $currentIndent; + + if ($this->_debug === true) { + $type = $tokens[$first]['type']; + echo "\t=> indent set to $currentIndent by token $first ($type)".PHP_EOL; + } + }//end if + } else { + // Don't force current indent to divisible because there could be custom + // rules in place between parenthesis, such as with arrays. $currentIndent = ($tokens[$first]['column'] - 1); if (isset($adjustments[$first]) === true) { $currentIndent += $adjustments[$first]; } - // Make sure it is divisible by our expected indent. - if ($tokens[$tokens[$scopeCloser]['scope_condition']]['code'] !== T_CLOSURE) { - $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); - } + $setIndents[$first] = $currentIndent; if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$first]['type']; + echo "\t=> checking indent of $checkIndent; main indent set to $currentIndent by token $first ($type)".PHP_EOL; } }//end if - } else { - // Don't force current indent to divisible because there could be custom - // rules in place between parenthesis, such as with arrays. - $currentIndent = ($tokens[$first]['column'] - 1); - if (isset($adjustments[$first]) === true) { - $currentIndent += $adjustments[$first]; - } - - if ($this->_debug === true) { - echo "\t=> checking indent of $checkIndent; main indent set to $currentIndent".PHP_EOL; - } }//end if } else if ($this->_debug === true) { echo "\t * ignoring single-line definition *".PHP_EOL; @@ -363,7 +429,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) if ($this->_debug === true) { $line = $tokens[$first]['line']; $type = $tokens[$first]['type']; - echo "\t* first token on line $line is $type *".PHP_EOL; + echo "\t* first token on line $line is $first ($type) *".PHP_EOL; } if ($first === $tokens[$arrayCloser]['bracket_opener']) { @@ -372,7 +438,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $first--; } - $prev = $phpcsFile->findStartOfStatement($first); + $prev = $phpcsFile->findStartOfStatement($first, T_COMMA); if ($prev !== $first) { // This is not the start of the statement. if ($this->_debug === true) { @@ -382,12 +448,12 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $prev, true); - $prev = $phpcsFile->findStartOfStatement($first); + $prev = $phpcsFile->findStartOfStatement($first, T_COMMA); $first = $phpcsFile->findFirstOnLine(T_WHITESPACE, $prev, true); if ($this->_debug === true) { $line = $tokens[$first]['line']; $type = $tokens[$first]['type']; - echo "\t* amended first token is $type on line $line *".PHP_EOL; + echo "\t* amended first token is $first ($type) on line $line *".PHP_EOL; } } @@ -400,6 +466,13 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) if ($this->_debug === true) { echo "\t* first token is a scope closer; ignoring closing short array bracket *".PHP_EOL; } + + if (isset($setIndents[$first]) === true) { + $currentIndent = $setIndents[$first]; + if ($this->_debug === true) { + echo "\t=> indent reset to $currentIndent".PHP_EOL; + } + } } else { // Don't force current indent to be divisible because there could be custom // rules in place for arrays. @@ -408,10 +481,13 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $currentIndent += $adjustments[$first]; } + $setIndents[$first] = $currentIndent; + if ($this->_debug === true) { - echo "\t=> checking indent of $checkIndent; main indent set to $currentIndent".PHP_EOL; + $type = $tokens[$first]['type']; + echo "\t=> checking indent of $checkIndent; main indent set to $currentIndent by token $first ($type)".PHP_EOL; } - } + }//end if } else if ($this->_debug === true) { echo "\t * ignoring single-line definition *".PHP_EOL; }//end if @@ -520,8 +596,11 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); } + $setIndents[$scopeCloser] = $currentIndent; + if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$scopeCloser]['type']; + echo "\t=> indent set to $currentIndent by token $scopeCloser ($type)".PHP_EOL; } // We only check the indent of scope closers if they are @@ -624,11 +703,13 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } // Make sure it is divisible by our expected indent. - $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); - $checkIndent = (int) (ceil($checkIndent / $this->indent) * $this->indent); + $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $checkIndent = (int) (ceil($checkIndent / $this->indent) * $this->indent); + $setIndents[$first] = $currentIndent; if ($this->_debug === true) { - echo "\t=> checking indent of $checkIndent; main indent set to $currentIndent".PHP_EOL; + $type = $tokens[$first]['type']; + echo "\t=> checking indent of $checkIndent; main indent set to $currentIndent by token $first ($type)".PHP_EOL; } }//end if @@ -654,11 +735,13 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) && $tokens[$lastOpener]['level'] === $tokens[$checkToken]['level'] && $tokens[$lastOpener]['scope_closer'] === $tokens[$checkToken]['scope_closer'] ) { - $currentIndent -= $this->indent; + $currentIndent -= $this->indent; + $setIndents[$lastOpener] = $currentIndent; if ($this->_debug === true) { $line = $tokens[$i]['line']; + $type = $tokens[$lastOpener]['type']; echo "Shared closer found on line $line".PHP_EOL; - echo "\t=> indent set to $currentIndent".PHP_EOL; + echo "\t=> indent set to $currentIndent by token $lastOpener ($type)".PHP_EOL; } } @@ -772,6 +855,11 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) echo "\t=> Add adjustment of ".$adjustments[$checkToken]." for token $checkToken ($type) on line $line".PHP_EOL; } } + } else { + // Assume the change would be applied and continue + // checking indents under this assumption. This gives more + // technically accurate error messages. + $adjustments[$checkToken] = ($checkIndent - $tokenIndent); }//end if }//end if @@ -828,10 +916,12 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } // Make sure it is divisible by our expected indent. - $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $setIndents[$i] = $currentIndent; if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$i]['type']; + echo "\t=> indent set to $currentIndent by token $i ($type)".PHP_EOL; } continue; @@ -861,10 +951,12 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } // Make sure it is divisible by our expected indent. - $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $setIndents[$i] = $currentIndent; if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$i]['type']; + echo "\t=> indent set to $currentIndent by token $i ($type)".PHP_EOL; } continue; @@ -898,9 +990,11 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) // Make sure it is divisible by our expected indent. $currentIndent = (int) (floor($currentIndent / $this->indent) * $this->indent); $i = $tokens[$i]['scope_opener']; + $setIndents[$i] = $currentIndent; if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$i]['type']; + echo "\t=> indent set to $currentIndent by token $i ($type)".PHP_EOL; } continue; @@ -934,10 +1028,12 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } $currentIndent += $this->indent; + $setIndents[$i] = $currentIndent; $openScopes[$tokens[$i]['scope_closer']] = $tokens[$i]['scope_condition']; if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$i]['type']; + echo "\t=> indent set to $currentIndent by token $i ($type)".PHP_EOL; } continue; @@ -971,10 +1067,12 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } // Make sure it is divisible by our expected indent. - $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $setIndents[$first] = $currentIndent; if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$first]['type']; + echo "\t=> indent set to $currentIndent by token $first ($type)".PHP_EOL; } continue; @@ -1080,7 +1178,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) if ($this->_debug === true) { $line = $tokens[$first]['line']; $type = $tokens[$first]['type']; - echo "\t* first token on line $line is $type *".PHP_EOL; + echo "\t* first token on line $line is $first ($type) *".PHP_EOL; } $prev = $phpcsFile->findStartOfStatement($first); @@ -1096,7 +1194,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) if ($this->_debug === true) { $line = $tokens[$first]['line']; $type = $tokens[$first]['type']; - echo "\t* amended first token is $type on line $line *".PHP_EOL; + echo "\t* amended first token is $first ($type) on line $line *".PHP_EOL; } } @@ -1112,14 +1210,20 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) echo "\t* first token is a scope closer *".PHP_EOL; } - $currentIndent -= $this->indent; + if ($condition === 0 || $tokens[$condition]['scope_opener'] < $first) { + $currentIndent = $setIndents[$first]; + } else if ($this->_debug === true) { + echo "\t* ignoring scope closer *".PHP_EOL; + } } // Make sure it is divisible by our expected indent. - $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $currentIndent = (int) (ceil($currentIndent / $this->indent) * $this->indent); + $setIndents[$first] = $currentIndent; if ($this->_debug === true) { - echo "\t=> indent set to $currentIndent".PHP_EOL; + $type = $tokens[$first]['type']; + echo "\t=> indent set to $currentIndent by token $first ($type)".PHP_EOL; } }//end if }//end for diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php index 1a5fa068..2157d1a7 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/ClassCommentSniff.php @@ -71,29 +71,9 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $phpcsFile->addError('Missing class doc comment', $stackPtr, 'Missing'); $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'no'); return; - } else { - $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'yes'); } - // Try and determine if this is a file comment instead of a class comment. - // We assume that if this is the first comment after the open PHP tag, then - // it is most likely a file comment instead of a class comment. - if ($tokens[$commentEnd]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - $start = ($tokens[$commentEnd]['comment_opener'] - 1); - } else { - $start = $phpcsFile->findPrevious(T_COMMENT, ($commentEnd - 1), null, true); - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, $start, null, true); - if ($tokens[$prev]['code'] === T_OPEN_TAG) { - $prevOpen = $phpcsFile->findPrevious(T_OPEN_TAG, ($prev - 1)); - if ($prevOpen === false) { - // This is a comment directly after the first open tag, - // so probably a file comment. - $phpcsFile->addError('Missing class doc comment', $stackPtr, 'Missing'); - return; - } - } + $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'yes'); if ($tokens[$commentEnd]['code'] === T_COMMENT) { $phpcsFile->addError('You must use "/**" style comments for a class comment', $stackPtr, 'WrongStyle'); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php index f4a48bc4..979c0da0 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Commenting/FileCommentSniff.php @@ -147,13 +147,47 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $phpcsFile->addError('Missing file doc comment', $errorToken, 'Missing'); $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); return ($phpcsFile->numTokens + 1); - } else { - $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); } - // Check the PHP Version, which should be in some text before the first tag. $commentEnd = $tokens[$commentStart]['comment_closer']; - $found = false; + + $nextToken = $phpcsFile->findNext( + T_WHITESPACE, + ($commentEnd + 1), + null, + true + ); + + $ignore = array( + T_CLASS, + T_INTERFACE, + T_TRAIT, + T_FUNCTION, + T_CLOSURE, + T_PUBLIC, + T_PRIVATE, + T_PROTECTED, + T_FINAL, + T_STATIC, + T_ABSTRACT, + T_CONST, + T_PROPERTY, + T_INCLUDE, + T_INCLUDE_ONCE, + T_REQUIRE, + T_REQUIRE_ONCE, + ); + + if (in_array($tokens[$nextToken]['code'], $ignore) === true) { + $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); + $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); + return ($phpcsFile->numTokens + 1); + } + + $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); + + // Check the PHP Version, which should be in some text before the first tag. + $found = false; for ($i = ($commentStart + 1); $i < $commentEnd; $i++) { if ($tokens[$i]['code'] === T_DOC_COMMENT_TAG) { break; diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php index ccd85c2c..2de5d96b 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/ControlStructures/MultiLineConditionSniff.php @@ -118,9 +118,9 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) // Each line between the parenthesis should be indented 4 spaces // and start with an operator, unless the line is inside a // function call, in which case it is ignored. - $lastLine = $tokens[$openBracket]['line']; + $prevLine = $tokens[$openBracket]['line']; for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { - if ($tokens[$i]['line'] !== $lastLine) { + if ($tokens[$i]['line'] !== $prevLine) { if ($tokens[$i]['line'] === $tokens[$closeBracket]['line']) { $next = $phpcsFile->findNext(T_WHITESPACE, $i, null, true); if ($next !== $closeBracket) { @@ -152,7 +152,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) }//end if if ($tokens[$i]['code'] === T_COMMENT) { - $lastLine = $tokens[$i]['line']; + $prevLine = $tokens[$i]['line']; continue; } @@ -181,8 +181,8 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } } - if ($tokens[$i]['line'] !== $tokens[$closeBracket]['line']) { - $next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, $i, null, true); + $next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, $i, null, true); + if ($next !== $closeBracket) { if (isset(PHP_CodeSniffer_Tokens::$booleanOperators[$tokens[$next]['code']]) === false) { $error = 'Each line in a multi-line IF statement must begin with a boolean operator'; $fix = $phpcsFile->addFixableError($error, $i, 'StartWithBoolean'); @@ -202,7 +202,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } }//end if - $lastLine = $tokens[$i]['line']; + $prevLine = $tokens[$i]['line']; }//end if if ($tokens[$i]['code'] === T_STRING) { @@ -211,7 +211,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) // This is a function call, so skip to the end as they // have their own indentation rules. $i = $tokens[$next]['parenthesis_closer']; - $lastLine = $tokens[$i]['line']; + $prevLine = $tokens[$i]['line']; continue; } } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php index 4c3b0275..4c2c03a7 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionCallSignatureSniff.php @@ -165,7 +165,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) /** - * Processes single-line calls. + * Determine if this is a multi-line function call. * * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. * @param int $stackPtr The position of the current token @@ -353,11 +353,21 @@ public function processMultiLineCall(PHP_CodeSniffer_File $phpcsFile, $stackPtr, } // Each line between the parenthesis should be indented n spaces. - $lastLine = $tokens[$openBracket]['line']; + $lastLine = ($tokens[$openBracket]['line'] - 1); $argStart = null; $argEnd = null; $inArg = false; - for ($i = ($openBracket + 1); $i < $closeBracket; $i++) { + + // Start processing at the first argument. + $i = $phpcsFile->findNext(T_WHITESPACE, ($openBracket + 1), null, true); + if ($tokens[($i - 1)]['code'] === T_WHITESPACE + && $tokens[($i - 1)]['line'] === $tokens[$i]['line'] + ) { + // Make sure we check the indent. + $i--; + } + + for ($i; $i < $closeBracket; $i++) { if ($i > $argStart && $i < $argEnd) { $inArg = true; } else { @@ -384,76 +394,80 @@ public function processMultiLineCall(PHP_CodeSniffer_File $phpcsFile, $stackPtr, continue; } - // We changed lines, so this should be a whitespace indent token, but first make - // sure it isn't a blank line because we don't need to check indent unless there - // is actually some code to indent. - if ($tokens[$i]['code'] === T_WHITESPACE) { - $nextCode = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), ($closeBracket + 1), true); - if ($tokens[$nextCode]['line'] !== $lastLine) { - if ($inArg === false) { - $error = 'Empty lines are not allowed in multi-line function calls'; - $fix = $phpcsFile->addFixableError($error, $i, 'EmptyLine'); - if ($fix === true) { - $phpcsFile->fixer->replaceToken($i, ''); + if ($tokens[$i]['line'] !== $tokens[$openBracket]['line']) { + // We changed lines, so this should be a whitespace indent token, but first make + // sure it isn't a blank line because we don't need to check indent unless there + // is actually some code to indent. + if ($tokens[$i]['code'] === T_WHITESPACE) { + $nextCode = $phpcsFile->findNext(T_WHITESPACE, ($i + 1), ($closeBracket + 1), true); + if ($tokens[$nextCode]['line'] !== $lastLine) { + if ($inArg === false) { + $error = 'Empty lines are not allowed in multi-line function calls'; + $fix = $phpcsFile->addFixableError($error, $i, 'EmptyLine'); + if ($fix === true) { + $phpcsFile->fixer->replaceToken($i, ''); + } } - } - continue; + continue; + } + } else { + $nextCode = $i; } - } else { - $nextCode = $i; - } - if ($tokens[$nextCode]['line'] === $tokens[$closeBracket]['line']) { - // Closing brace needs to be indented to the same level - // as the function call. - $inArg = false; - $expectedIndent = $functionIndent; - } else { - $expectedIndent = ($functionIndent + $this->indent); - } + if ($tokens[$nextCode]['line'] === $tokens[$closeBracket]['line']) { + // Closing brace needs to be indented to the same level + // as the function call. + $inArg = false; + $expectedIndent = $functionIndent; + } else { + $expectedIndent = ($functionIndent + $this->indent); + } - if ($tokens[$i]['code'] !== T_WHITESPACE - && $tokens[$i]['code'] !== T_DOC_COMMENT_WHITESPACE - ) { - // Just check if it is a multi-line block comment. If so, we can - // calculate the indent from the whitespace before the content. - if ($tokens[$i]['code'] === T_COMMENT - && $tokens[($i - 1)]['code'] === T_COMMENT + if ($tokens[$i]['code'] !== T_WHITESPACE + && $tokens[$i]['code'] !== T_DOC_COMMENT_WHITESPACE ) { - $trimmed = ltrim($tokens[$i]['content']); - $foundIndent = (strlen($tokens[$i]['content']) - strlen($trimmed)); + // Just check if it is a multi-line block comment. If so, we can + // calculate the indent from the whitespace before the content. + if ($tokens[$i]['code'] === T_COMMENT + && $tokens[($i - 1)]['code'] === T_COMMENT + ) { + $trimmed = ltrim($tokens[$i]['content']); + $foundIndent = (strlen($tokens[$i]['content']) - strlen($trimmed)); + } else { + $foundIndent = 0; + } } else { - $foundIndent = 0; + $foundIndent = strlen($tokens[$i]['content']); } - } else { - $foundIndent = strlen($tokens[$i]['content']); - } - if ($foundIndent < $expectedIndent - || ($inArg === false - && $expectedIndent !== $foundIndent) - ) { - $error = 'Multi-line function call not indented correctly; expected %s spaces but found %s'; - $data = array( - $expectedIndent, - $foundIndent, - ); - - $fix = $phpcsFile->addFixableError($error, $i, 'Indent', $data); - if ($fix === true) { - $padding = str_repeat(' ', $expectedIndent); - if ($foundIndent === 0) { - $phpcsFile->fixer->addContentBefore($i, $padding); - } else { - if ($tokens[$i]['code'] === T_COMMENT) { - $comment = $padding.ltrim($tokens[$i]['content']); - $phpcsFile->fixer->replaceToken($i, $comment); + if ($foundIndent < $expectedIndent + || ($inArg === false + && $expectedIndent !== $foundIndent) + ) { + $error = 'Multi-line function call not indented correctly; expected %s spaces but found %s'; + $data = array( + $expectedIndent, + $foundIndent, + ); + + $fix = $phpcsFile->addFixableError($error, $i, 'Indent', $data); + if ($fix === true) { + $padding = str_repeat(' ', $expectedIndent); + if ($foundIndent === 0) { + $phpcsFile->fixer->addContentBefore($i, $padding); } else { - $phpcsFile->fixer->replaceToken($i, $padding); + if ($tokens[$i]['code'] === T_COMMENT) { + $comment = $padding.ltrim($tokens[$i]['content']); + $phpcsFile->fixer->replaceToken($i, $comment); + } else { + $phpcsFile->fixer->replaceToken($i, $padding); + } } } - } + }//end if + } else { + $nextCode = $i; }//end if if ($inArg === false) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php index e28f6e95..c681257d 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PEAR/Sniffs/Functions/FunctionDeclarationSniff.php @@ -167,34 +167,54 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) }//end if }//end if - // Check if this is a single line or multi-line declaration. - $singleLine = true; - if ($tokens[$openBracket]['line'] === $tokens[$closeBracket]['line']) { - // Closures may use the USE keyword and so be multi-line in this way. - if ($tokens[$stackPtr]['code'] === T_CLOSURE) { - if ($use !== false) { - // If the opening and closing parenthesis of the use statement - // are also on the same line, this is a single line declaration. - $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); - $close = $tokens[$open]['parenthesis_closer']; - if ($tokens[$open]['line'] !== $tokens[$close]['line']) { - $singleLine = false; - } - } - } + if ($this->isMultiLineDeclaration($phpcsFile, $stackPtr, $openBracket, $tokens) === true) { + $this->processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); } else { - $singleLine = false; - } - - if ($singleLine === true) { $this->processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens); - } else { - $this->processMultiLineDeclaration($phpcsFile, $stackPtr, $tokens); } }//end process() + /** + * Determine if this is a multi-line function declaration. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * @param int $openBracket The position of the opening bracket + * in the stack passed in $tokens. + * @param array $tokens The stack of tokens that make up + * the file. + * + * @return void + */ + public function isMultiLineDeclaration(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $openBracket, $tokens) + { + $closeBracket = $tokens[$openBracket]['parenthesis_closer']; + if ($tokens[$openBracket]['line'] !== $tokens[$closeBracket]['line']) { + return true; + } + + // Closures may use the USE keyword and so be multi-line in this way. + if ($tokens[$stackPtr]['code'] === T_CLOSURE) { + $use = $phpcsFile->findNext(T_USE, ($closeBracket + 1), $tokens[$stackPtr]['scope_opener']); + if ($use !== false) { + // If the opening and closing parenthesis of the use statement + // are also on the same line, this is a single line declaration. + $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); + $close = $tokens[$open]['parenthesis_closer']; + if ($tokens[$open]['line'] !== $tokens[$close]['line']) { + return true; + } + } + } + + return false; + + }//end isMultiLineDeclaration() + + /** * Processes single-line declarations. * diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php index dd283775..a41051f2 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR1/Sniffs/Files/SideEffectsSniff.php @@ -119,6 +119,11 @@ private function _searchForConflict(PHP_CodeSniffer_File $phpcsFile, $start, $en continue; } + // Ignore shebang. + if (substr($tokens[$i]['content'], 0, 2) === '#!') { + continue; + } + // Ignore entire namespace, declare, const and use statements. if ($tokens[$i]['code'] === T_NAMESPACE || $tokens[$i]['code'] === T_USE @@ -142,6 +147,12 @@ private function _searchForConflict(PHP_CodeSniffer_File $phpcsFile, $start, $en continue; } + // Ignore anon classes. + if ($tokens[$i]['code'] === T_ANON_CLASS) { + $i = $tokens[$i]['scope_closer']; + continue; + } + // Detect and skip over symbols. if (isset($symbols[$tokens[$i]['code']]) === true && isset($tokens[$i]['scope_closer']) === true diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php index 81d9c5cc..c219ba57 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php @@ -336,6 +336,7 @@ public function processOpen(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } else if ($tokens[($className - 1)]['code'] !== T_NS_SEPARATOR || $tokens[($className - 2)]['code'] !== T_STRING ) { + // Not part of a longer fully qualified class name. if ($tokens[($className - 1)]['code'] === T_COMMA || ($tokens[($className - 1)]['code'] === T_NS_SEPARATOR && $tokens[($className - 2)]['code'] === T_COMMA) @@ -369,7 +370,8 @@ public function processOpen(PHP_CodeSniffer_File $phpcsFile, $stackPtr) }//end if }//end if - if ($tokens[($className + 1)]['code'] !== T_NS_SEPARATOR + if ($checkingImplements === true + && $tokens[($className + 1)]['code'] !== T_NS_SEPARATOR && $tokens[($className + 1)]['code'] !== T_COMMA ) { if ($i !== ($classCount - 1)) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php new file mode 100644 index 00000000..8a4c188a --- /dev/null +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/Sniffs/Methods/FunctionClosingBraceSniff.php @@ -0,0 +1,104 @@ + + * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) + * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence + * @link http://pear.php.net/package/PHP_CodeSniffer + */ + +/** + * PSR2_Sniffs_Methods_FunctionClosingBraceSniff. + * + * Checks that the closing brace of a function goes directly after the body. + * + * @category PHP + * @package PHP_CodeSniffer + * @author Greg Sherwood + * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) + * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence + * @version Release: @package_version@ + * @link http://pear.php.net/package/PHP_CodeSniffer + */ +class PSR2_Sniffs_Methods_FunctionClosingBraceSniff implements PHP_CodeSniffer_Sniff +{ + + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + public function register() + { + return array( + T_FUNCTION, + T_CLOSURE, + ); + + }//end register() + + + /** + * Processes this test, when one of its tokens is encountered. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + + if (isset($tokens[$stackPtr]['scope_closer']) === false) { + // Probably an interface method. + return; + } + + $closeBrace = $tokens[$stackPtr]['scope_closer']; + $prevContent = $phpcsFile->findPrevious(T_WHITESPACE, ($closeBrace - 1), null, true); + $found = ($tokens[$closeBrace]['line'] - $tokens[$prevContent]['line'] - 1); + + if ($found < 0) { + // Brace isn't on a new line, so not handled by us. + return; + } + + if ($found === 0) { + // All is good. + return; + } + + $error = 'Function closing brace must go on the next line following the body; found %s blank lines before brace'; + $data = array($found); + $fix = $phpcsFile->addFixableError($error, $closeBrace, 'SpacingBeforeClose', $data); + + if ($fix === true) { + $phpcsFile->fixer->beginChangeset(); + for ($i = ($prevContent + 1); $i < $closeBrace; $i++) { + if ($tokens[$i]['line'] === $tokens[$prevContent]['line']) { + continue; + } + + // Don't remove any identation before the brace. + if ($tokens[$i]['line'] === $tokens[$closeBrace]['line']) { + break; + } + + $phpcsFile->fixer->replaceToken($i, ''); + } + + $phpcsFile->fixer->endChangeset(); + } + + }//end process() + + +}//end class diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/ruleset.xml b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/ruleset.xml index e4127107..1bd543a4 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/ruleset.xml +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/PSR2/ruleset.xml @@ -109,6 +109,7 @@ + @@ -155,6 +156,24 @@ The structure body MUST be indented once The closing brace MUST be on the next line after the body --> + + + + 0 + + + 0 + + + 0 + + + 0 + diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php index fb9b4b53..0a4b55fd 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayBracketSpacingSniff.php @@ -65,6 +65,10 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) if ($tokens[$stackPtr]['code'] === T_OPEN_SQUARE_BRACKET) { $openBracket = $stackPtr; } else { + if (isset($tokens[$stackPtr]['bracket_opener']) === false) { + return; + } + $openBracket = $tokens[$stackPtr]['bracket_opener']; } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php index 7ae5cbfc..d759c413 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Arrays/ArrayDeclarationSniff.php @@ -120,11 +120,11 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $phpcsFile->fixer->endChangeset(); } - - // We can return here because there is nothing else to check. All code - // below can assume that the array is not empty. - return; } + + // We can return here because there is nothing else to check. All code + // below can assume that the array is not empty. + return; } if ($tokens[$arrayStart]['line'] === $tokens[$arrayEnd]['line']) { @@ -855,7 +855,7 @@ public function processMultiLineArray(PHP_CodeSniffer_File $phpcsFile, $stackPtr if ($fix === true) { // Find the end of the line and put a comma there. - for ($i = ($index['value'] + 1); $i < $phpcsFile->numTokens; $i++) { + for ($i = ($index['value'] + 1); $i < $arrayEnd; $i++) { if ($tokens[$i]['line'] > $valueLine) { break; } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php index a428f3ff..02d6ae19 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionNameSpacingSniff.php @@ -76,8 +76,10 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) ); $endTokens += PHP_CodeSniffer_Tokens::$commentTokens; + $prev = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr - 1), null, true); + $foundContent = false; - $currentLine = $tokens[$stackPtr]['line']; + $currentLine = $tokens[$prev]['line']; for ($i = ($stackPtr - 1); $i >= 0; $i--) { if (isset($endTokens[$tokens[$i]['code']]) === true) { break; diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php index 1f7a09ed..ee889fd6 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/ClassDefinitionOpeningBraceSpaceSniff.php @@ -71,9 +71,13 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } else { $content = $tokens[($stackPtr - 1)]['content']; if ($content !== ' ') { - $length = strlen($content); - if ($length === 1) { - $length = 'tab'; + if ($tokens[($stackPtr - 1)]['line'] < $tokens[$stackPtr]['line']) { + $length = 'newline'; + } else { + $length = strlen($content); + if ($length === 1) { + $length = 'tab'; + } } $error = 'Expected 1 space before opening brace of class definition; %s found'; diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/IndentationSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/IndentationSniff.php index a1910253..27e3a4c1 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/IndentationSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/IndentationSniff.php @@ -103,7 +103,10 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } } - if ($tokens[$i]['column'] !== 1) { + if ($tokens[$i]['column'] !== 1 + || $tokens[$i]['code'] === T_OPEN_CURLY_BRACKET + || $tokens[$i]['code'] === T_CLOSE_CURLY_BRACKET + ) { continue; } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/OpacitySniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/OpacitySniff.php index ec934a12..4f2a32c4 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/OpacitySniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/CSS/OpacitySniff.php @@ -83,7 +83,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } else { if (strlen($value) > 3) { $error = 'Opacity values must have a single value after the decimal point'; - $phpcsFile->addError($error, $next, 'SpacingAfterPoint'); + $phpcsFile->addError($error, $next, 'DecimalPrecision'); } else if ($value === '0.0' || $value === '1.0') { $error = 'Opacity value does not require decimal point; use %s instead'; $data = array($value{0}); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php index a57c4ce7..60f31d0b 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/BlockCommentSniff.php @@ -30,6 +30,13 @@ class Squiz_Sniffs_Commenting_BlockCommentSniff implements PHP_CodeSniffer_Sniff { + /** + * The --tab-width CLI value that is being used. + * + * @var int + */ + private $_tabWidth = null; + /** * Returns an array of tokens this test wants to listen for. @@ -57,6 +64,16 @@ public function register() */ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { + if ($this->_tabWidth === null) { + $cliValues = $phpcsFile->phpcs->cli->getCommandLineValues(); + if (isset($cliValues['tabWidth']) === false || $cliValues['tabWidth'] === 0) { + // We have no idea how wide tabs are, so assume 4 spaces for fixing. + $this->_tabWidth = 4; + } else { + $this->_tabWidth = $cliValues['tabWidth']; + } + } + $tokens = $phpcsFile->getTokens(); // If it's an inline comment, return. @@ -169,9 +186,18 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $error = 'Block comment text must start on a new line'; $fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoNewLine'); if ($fix === true) { + $indent = ''; + if ($tokens[($stackPtr - 1)]['code'] === T_WHITESPACE) { + if (isset($tokens[($stackPtr - 1)]['orig_content']) === true) { + $indent = $tokens[($stackPtr - 1)]['orig_content']; + } else { + $indent = $tokens[($stackPtr - 1)]['content']; + } + } + $comment = preg_replace( '/^(\s*\/\*\*?)/', - '$1'.$phpcsFile->eolChar.' ', + '$1'.$phpcsFile->eolChar.$indent, $tokens[$stackPtr]['content'], 1 ); @@ -179,7 +205,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } return; - } + }//end if $starColumn = ($tokens[$stackPtr]['column'] + 3); @@ -209,10 +235,18 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $error = 'First line of comment not aligned correctly; expected %s but found %s'; $fix = $phpcsFile->addFixableError($error, $commentLines[1], 'FirstLineIndent', $data); if ($fix === true) { - $newContent = str_repeat(' ', $starColumn).ltrim($content); - $phpcsFile->fixer->replaceToken($commentLines[1], $newContent); + if (isset($tokens[$commentLines[1]]['orig_content']) === true + && $tokens[$commentLines[1]]['orig_content'][0] === "\t" + ) { + // Line is indented using tabs. + $padding = str_repeat("\t", floor($starColumn / $this->_tabWidth)); + } else { + $padding = str_repeat(' ', $starColumn); + } + + $phpcsFile->fixer->replaceToken($commentLines[1], $padding.ltrim($content)); } - } + }//end if if (preg_match('/^\p{Ll}/u', $commentText) === 1) { $error = 'Block comments must start with a capital letter'; @@ -252,10 +286,18 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $error = 'Comment line indented incorrectly; expected at least %s but found %s'; $fix = $phpcsFile->addFixableError($error, $line, 'LineIndent', $data); if ($fix === true) { - $newContent = str_repeat(' ', $starColumn).ltrim($tokens[$line]['content']); - $phpcsFile->fixer->replaceToken($line, $newContent); + if (isset($tokens[$line]['orig_content']) === true + && $tokens[$line]['orig_content'][0] === "\t" + ) { + // Line is indented using tabs. + $padding = str_repeat("\t", floor($starColumn / $this->_tabWidth)); + } else { + $padding = str_repeat(' ', $starColumn); + } + + $phpcsFile->fixer->replaceToken($line, $padding.ltrim($tokens[$line]['content'])); } - } + }//end if }//end foreach // Finally, test the last line is correct. diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php index 8c02bf42..9b2e9bc8 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/ClassCommentSniff.php @@ -68,28 +68,11 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) && $tokens[$commentEnd]['code'] !== T_COMMENT ) { $phpcsFile->addError('Missing class doc comment', $stackPtr, 'Missing'); + $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'no'); return; } - // Try and determine if this is a file comment instead of a class comment. - // We assume that if this is the first comment after the open PHP tag, then - // it is most likely a file comment instead of a class comment. - if ($tokens[$commentEnd]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - $start = ($tokens[$commentEnd]['comment_opener'] - 1); - } else { - $start = $phpcsFile->findPrevious(T_COMMENT, ($commentEnd - 1), null, true); - } - - $prev = $phpcsFile->findPrevious(T_WHITESPACE, $start, null, true); - if ($tokens[$prev]['code'] === T_OPEN_TAG) { - $prevOpen = $phpcsFile->findPrevious(T_OPEN_TAG, ($prev - 1)); - if ($prevOpen === false) { - // This is a comment directly after the first open tag, - // so probably a file comment. - $phpcsFile->addError('Missing class doc comment', $stackPtr, 'Missing'); - return; - } - } + $phpcsFile->recordMetric($stackPtr, 'Class has doc comment', 'yes'); if ($tokens[$commentEnd]['code'] === T_COMMENT) { $phpcsFile->addError('You must use "/**" style comments for a class comment', $stackPtr, 'WrongStyle'); @@ -102,11 +85,6 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } $commentStart = $tokens[$commentEnd]['comment_opener']; - if ($tokens[$prev]['line'] !== ($tokens[$commentStart]['line'] - 2)) { - $error = 'There must be exactly one blank line before the class comment'; - $phpcsFile->addError($error, $commentStart, 'SpacingBefore'); - } - foreach ($tokens[$commentStart]['comment_tags'] as $tag) { $error = '%s tag is not allowed in class comment'; $data = array($tokens[$tag]['content']); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php index 4aeb9186..d3c7f3d3 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FileCommentSniff.php @@ -70,14 +70,51 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) if ($tokens[$commentStart]['code'] === T_COMMENT) { $phpcsFile->addError('You must use "/**" style comments for a file comment', $commentStart, 'WrongStyle'); + $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); return ($phpcsFile->numTokens + 1); } else if ($commentStart === false || $tokens[$commentStart]['code'] !== T_DOC_COMMENT_OPEN_TAG) { $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); + $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); return ($phpcsFile->numTokens + 1); } $commentEnd = $tokens[$commentStart]['comment_closer']; + $nextToken = $phpcsFile->findNext( + T_WHITESPACE, + ($commentEnd + 1), + null, + true + ); + + $ignore = array( + T_CLASS, + T_INTERFACE, + T_TRAIT, + T_FUNCTION, + T_CLOSURE, + T_PUBLIC, + T_PRIVATE, + T_PROTECTED, + T_FINAL, + T_STATIC, + T_ABSTRACT, + T_CONST, + T_PROPERTY, + T_INCLUDE, + T_INCLUDE_ONCE, + T_REQUIRE, + T_REQUIRE_ONCE, + ); + + if (in_array($tokens[$nextToken]['code'], $ignore) === true) { + $phpcsFile->addError('Missing file doc comment', $stackPtr, 'Missing'); + $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'no'); + return ($phpcsFile->numTokens + 1); + } + + $phpcsFile->recordMetric($stackPtr, 'File has doc comment', 'yes'); + // No blank line between the open tag and the file comment. if ($tokens[$commentStart]['line'] > ($tokens[$stackPtr]['line'] + 1)) { $error = 'There must be no blank lines before the file comment'; diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php index 9cff6dd4..c1dc37c9 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentSniff.php @@ -97,9 +97,14 @@ protected function processReturn(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $co } } + // Support both a return type and a description. The return type + // is anything up to the first space. + $returnParts = explode(' ', $content, 2); + $returnType = $returnParts[0]; + // If the return type is void, make sure there is // no return statement in the function. - if ($content === 'void') { + if ($returnType === 'void') { if (isset($tokens[$stackPtr]['scope_closer']) === true) { $endToken = $tokens[$stackPtr]['scope_closer']; for ($returnToken = $stackPtr; $returnToken < $endToken; $returnToken++) { @@ -125,7 +130,7 @@ protected function processReturn(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $co } } }//end if - } else if ($content !== 'mixed') { + } else if ($returnType !== 'mixed') { // If return type is not void, there needs to be a return statement // somewhere in the function that returns something. if (isset($tokens[$stackPtr]['scope_closer']) === true) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php index 23fa4cb6..98abfb8d 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/FunctionCommentThrowTagSniff.php @@ -73,14 +73,8 @@ protected function processTokenWithinScope(PHP_CodeSniffer_File $phpcsFile, $sta $commentEnd = $phpcsFile->findPrevious($find, ($currScope - 1), null, true); if ($tokens[$commentEnd]['code'] === T_COMMENT) { - // Inline comments might just be closing comments for - // control structures or functions instead of function comments - // using the wrong comment type. If there is other code on the line, - // assume they relate to that code. - $prev = $phpcsFile->findPrevious($find, ($commentEnd - 1), null, true); - if ($prev !== false && $tokens[$prev]['line'] === $tokens[$commentEnd]['line']) { - $commentEnd = $prev; - } + // Function is using the wrong type of comment. + return; } if ($tokens[$commentEnd]['code'] !== T_DOC_COMMENT_CLOSE_TAG @@ -90,17 +84,16 @@ protected function processTokenWithinScope(PHP_CodeSniffer_File $phpcsFile, $sta return; } - // Find the position where the current function scope ends. - $currScopeEnd = 0; - if (isset($tokens[$currScope]['scope_closer']) === true) { - $currScopeEnd = $tokens[$currScope]['scope_closer']; - } + $currScopeEnd = $tokens[$currScope]['scope_closer']; // Find all the exception type token within the current scope. $throwTokens = array(); $currPos = $stackPtr; - if ($currScopeEnd !== 0) { - while ($currPos < $currScopeEnd && $currPos !== false) { + $foundThrows = false; + while ($currPos < $currScopeEnd && $currPos !== false) { + if ($phpcsFile->hasCondition($currPos, T_CLOSURE) === false) { + $foundThrows = true; + /* If we can't find a NEW, we are probably throwing a variable, so we ignore it, but they still need to @@ -142,10 +135,14 @@ protected function processTokenWithinScope(PHP_CodeSniffer_File $phpcsFile, $sta } }//end if }//end if + }//end if - $currPos = $phpcsFile->findNext(T_THROW, ($currPos + 1), $currScopeEnd); - }//end while - }//end if + $currPos = $phpcsFile->findNext(T_THROW, ($currPos + 1), $currScopeEnd); + }//end while + + if ($foundThrows === false) { + return; + } // Only need one @throws tag for each type of exception thrown. $throwTokens = array_unique($throwTokens); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php index 6cf184cc..fb5710fc 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Commenting/InlineCommentSniff.php @@ -94,6 +94,10 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) T_ABSTRACT, T_CONST, T_PROPERTY, + T_INCLUDE, + T_INCLUDE_ONCE, + T_REQUIRE, + T_REQUIRE_ONCE, ); if (in_array($tokens[$nextToken]['code'], $ignore) === true) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php index ebc537cc..72f08073 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/InlineIfDeclarationSniff.php @@ -89,7 +89,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) return; } - $spaceBefore = ($tokens[$stackPtr]['column'] - ($tokens[$contentBefore]['column'] + strlen($tokens[$contentBefore]['content']))); + $spaceBefore = ($tokens[$stackPtr]['column'] - ($tokens[$contentBefore]['column'] + $tokens[$contentBefore]['length'])); if ($spaceBefore !== 1) { $error = 'Inline shorthand IF statement requires 1 space before THEN; %s found'; $data = array($spaceBefore); @@ -108,7 +108,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $contentBefore = $phpcsFile->findPrevious(T_WHITESPACE, ($inlineElse - 1), null, true); $contentAfter = $phpcsFile->findNext(T_WHITESPACE, ($inlineElse + 1), null, true); - $spaceBefore = ($tokens[$inlineElse]['column'] - ($tokens[$contentBefore]['column'] + strlen($tokens[$contentBefore]['content']))); + $spaceBefore = ($tokens[$inlineElse]['column'] - ($tokens[$contentBefore]['column'] + $tokens[$contentBefore]['length'])); if ($spaceBefore !== 1) { $error = 'Inline shorthand IF statement requires 1 space before ELSE; %s found'; $data = array($spaceBefore); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php index d615b6e7..8d7eab98 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/FunctionDeclarationArgumentSpacingSniff.php @@ -215,56 +215,71 @@ public function processBracket(PHP_CodeSniffer_File $phpcsFile, $openBracket) // This is not the first argument in the function declaration. $arg = $tokens[$nextParam]['content']; + // Before we throw an error, make sure there is no type hint. + $comma = $phpcsFile->findPrevious(T_COMMA, ($nextParam - 1)); + $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($comma + 1), null, true); + if ($phpcsFile->isReference($nextToken) === true) { + $nextToken++; + } + + $gap = 0; if ($tokens[$whitespace]['code'] === T_WHITESPACE) { $gap = strlen($tokens[$whitespace]['content']); + } - // Before we throw an error, make sure there is no type hint. - $comma = $phpcsFile->findPrevious(T_COMMA, ($nextParam - 1)); - $nextToken = $phpcsFile->findNext(T_WHITESPACE, ($comma + 1), null, true); - if ($phpcsFile->isReference($nextToken) === true) { - $nextToken++; - } - - if ($nextToken !== $nextParam) { - // There was a type hint, so check the spacing between - // the hint and the variable as well. - $hint = $tokens[$nextToken]['content']; + if ($nextToken !== $nextParam) { + // There was a type hint, so check the spacing between + // the hint and the variable as well. + $hint = $tokens[$nextToken]['content']; - if ($gap !== 1) { - $error = 'Expected 1 space between type hint and argument "%s"; %s found'; - $data = array( - $arg, - $gap, - ); - $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpacingAfterHint', $data); - if ($fix === true) { + if ($gap !== 1) { + $error = 'Expected 1 space between type hint and argument "%s"; %s found'; + $data = array( + $arg, + $gap, + ); + $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpacingAfterHint', $data); + if ($fix === true) { + if ($gap === 0) { + $phpcsFile->fixer->addContent($whitespace, ' '); + } else { $phpcsFile->fixer->replaceToken($whitespace, ' '); } } + } - if ($multiLine === false) { - if ($tokens[($comma + 1)]['code'] !== T_WHITESPACE) { - $error = 'Expected 1 space between comma and type hint "%s"; 0 found'; - $data = array($hint); - $fix = $phpcsFile->addFixableError($error, $nextToken, 'NoSpaceBeforeHint', $data); + if ($multiLine === false) { + if ($tokens[($comma + 1)]['code'] !== T_WHITESPACE) { + $error = 'Expected 1 space between comma and type hint "%s"; 0 found'; + $data = array($hint); + $fix = $phpcsFile->addFixableError($error, $nextToken, 'NoSpaceBeforeHint', $data); + if ($fix === true) { + $phpcsFile->fixer->addContent($comma, ' '); + } + } else { + $gap = strlen($tokens[($comma + 1)]['content']); + if ($gap !== 1) { + $error = 'Expected 1 space between comma and type hint "%s"; %s found'; + $data = array( + $hint, + $gap, + ); + $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpacingBeforeHint', $data); if ($fix === true) { - $phpcsFile->fixer->addContent($comma, ' '); - } - } else { - $gap = strlen($tokens[($comma + 1)]['content']); - if ($gap !== 1) { - $error = 'Expected 1 space between comma and type hint "%s"; %s found'; - $data = array( - $hint, - $gap, - ); - $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpacingBeforeHint', $data); - if ($fix === true) { - $phpcsFile->fixer->replaceToken(($comma + 1), ' '); - } + $phpcsFile->fixer->replaceToken(($comma + 1), ' '); } - }//end if + } }//end if + }//end if + } else { + // No type hint. + if ($gap === 0) { + $error = 'Expected 1 space between comma and argument "%s"; 0 found'; + $data = array($arg); + $fix = $phpcsFile->addFixableError($error, $nextToken, 'NoSpaceBeforeArg', $data); + if ($fix === true) { + $phpcsFile->fixer->addContent($whitespace, ' '); + } } else if ($gap !== 1) { // Just make sure this is not actually an indent. if ($tokens[$whitespace]['line'] === $tokens[($whitespace - 1)]['line']) { @@ -280,13 +295,6 @@ public function processBracket(PHP_CodeSniffer_File $phpcsFile, $openBracket) } } }//end if - } else { - $error = 'Expected 1 space between comma and argument "%s"; 0 found'; - $data = array($arg); - $fix = $phpcsFile->addFixableError($error, $nextToken, 'NoSpaceBeforeArg', $data); - if ($fix === true) { - $phpcsFile->fixer->addContent($whitespace, ' '); - } }//end if } else { $gap = 0; @@ -303,7 +311,7 @@ public function processBracket(PHP_CodeSniffer_File $phpcsFile, $openBracket) $nextToken++; } - if ($nextToken !== $nextParam) { + if ($tokens[$nextToken]['code'] !== T_ELLIPSIS && $nextToken !== $nextParam) { // There was a type hint, so check the spacing between // the hint and the variable as well. $hint = $tokens[$nextToken]['content']; @@ -316,7 +324,11 @@ public function processBracket(PHP_CodeSniffer_File $phpcsFile, $openBracket) ); $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpacingAfterHint', $data); if ($fix === true) { - $phpcsFile->fixer->replaceToken(($nextToken + 1), ' '); + if ($gap === 0) { + $phpcsFile->fixer->addContent($nextToken, ' '); + } else { + $phpcsFile->fixer->replaceToken(($nextToken + 1), ' '); + } } } @@ -335,7 +347,7 @@ public function processBracket(PHP_CodeSniffer_File $phpcsFile, $openBracket) $fix = $phpcsFile->addFixableError($error, $nextToken, 'SpacingAfterOpenHint', $data); if ($fix === true) { $padding = str_repeat(' ', $this->requiredSpacesAfterOpen); - if ($gap === 0) { + if ($spaceAfterOpen === 0) { $phpcsFile->fixer->addContent($openBracket, $padding); } else { $phpcsFile->fixer->replaceToken(($openBracket + 1), $padding); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php index 2958d90b..f2d1e7f9 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php @@ -44,6 +44,73 @@ class Squiz_Sniffs_Functions_MultiLineFunctionDeclarationSniff extends PEAR_Snif ); + /** + * Determine if this is a multi-line function declaration. + * + * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. + * @param int $stackPtr The position of the current token + * in the stack passed in $tokens. + * @param int $openBracket The position of the opening bracket + * in the stack passed in $tokens. + * @param array $tokens The stack of tokens that make up + * the file. + * + * @return void + */ + public function isMultiLineDeclaration(PHP_CodeSniffer_File $phpcsFile, $stackPtr, $openBracket, $tokens) + { + $bracketsToCheck = array($stackPtr => $openBracket); + + // Closures may use the USE keyword and so be multi-line in this way. + if ($tokens[$stackPtr]['code'] === T_CLOSURE) { + $use = $phpcsFile->findNext(T_USE, ($tokens[$openBracket]['parenthesis_closer'] + 1), $tokens[$stackPtr]['scope_opener']); + if ($use !== false) { + $open = $phpcsFile->findNext(T_OPEN_PARENTHESIS, ($use + 1)); + if ($open !== false) { + $bracketsToCheck[$use] = $open; + } + } + } + + foreach ($bracketsToCheck as $stackPtr => $openBracket) { + // If the first argument is on a new line, this is a multi-line + // function declaration, even if there is only one argument. + $next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($openBracket + 1), null, true); + if ($tokens[$next]['line'] !== $tokens[$stackPtr]['line']) { + return true; + } + + $closeBracket = $tokens[$openBracket]['parenthesis_closer']; + + $end = $phpcsFile->findEndOfStatement($openBracket + 1); + while ($tokens[$end]['code'] === T_COMMA) { + // If the next bit of code is not on the same line, this is a + // multi-line function declaration. + $next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($end + 1), $closeBracket, true); + if ($next === false) { + continue(2); + } + + if ($tokens[$next]['line'] !== $tokens[$end]['line']) { + return true; + } + + $end = $phpcsFile->findEndOfStatement($next); + } + + // We've reached the last argument, so see if the next content + // (should be the close bracket) is also on the same line. + $next = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($end + 1), $closeBracket, true); + if ($next !== false && $tokens[$next]['line'] !== $tokens[$end]['line']) { + return true; + } + }//end foreach + + return false; + + }//end isMultiLineDeclaration() + + /** * Processes multi-line declarations. * diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php index 452959ca..90001b89 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/Operators/ComparisonOperatorUsageSniff.php @@ -184,6 +184,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $requiredOps = 0; $foundOps = 0; + $foundBools = 0; for ($i = $start; $i <= $end; $i++) { $type = $tokens[$i]['code']; @@ -199,36 +200,42 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $foundOps++; } - if ($phpcsFile->tokenizerType !== 'JS') { - if ($tokens[$i]['code'] === T_BOOLEAN_AND || $tokens[$i]['code'] === T_BOOLEAN_OR) { - $requiredOps++; + if ($tokens[$i]['code'] === T_TRUE || $tokens[$i]['code'] === T_FALSE) { + $foundBools++; + } - // When the instanceof operator is used with another operator - // like ===, you can get more ops than are required. - if ($foundOps > $requiredOps) { - $foundOps = $requiredOps; - } + if ($phpcsFile->tokenizerType !== 'JS' + && ($tokens[$i]['code'] === T_BOOLEAN_AND + || $tokens[$i]['code'] === T_BOOLEAN_OR) + ) { + $requiredOps++; - // If we get to here and we have not found the right number of - // comparison operators, then we must have had an implicit - // true operation ie. if ($a) instead of the required - // if ($a === true), so let's add an error. - if ($requiredOps !== $foundOps) { - $error = 'Implicit true comparisons prohibited; use === TRUE instead'; - $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); - $foundOps++; - } + // When the instanceof operator is used with another operator + // like ===, you can get more ops than are required. + if ($foundOps > $requiredOps) { + $foundOps = $requiredOps; } - }//end if + + // If we get to here and we have not found the right number of + // comparison operators, then we must have had an implicit + // true operation i.e., if ($a) instead of the required + // if ($a === true), so let's add an error. + if ($requiredOps !== $foundOps) { + $error = 'Implicit true comparisons prohibited; use === TRUE instead'; + $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); + $foundOps++; + } + } }//end for $requiredOps++; - if ($phpcsFile->tokenizerType !== 'JS') { - if ($foundOps < $requiredOps) { - $error = 'Implicit true comparisons prohibited; use === TRUE instead'; - $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); - } + if ($phpcsFile->tokenizerType !== 'JS' + && $foundOps < $requiredOps + && ($requiredOps !== $foundBools) + ) { + $error = 'Implicit true comparisons prohibited; use === TRUE instead'; + $phpcsFile->addError($error, $stackPtr, 'ImplicitTrue'); } }//end process() diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php index 980d999f..7601a2c5 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/InnerFunctionsSniff.php @@ -56,17 +56,27 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); - if ($phpcsFile->hasCondition($stackPtr, T_FUNCTION) === true) { - $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_EQUAL) { - // Ignore closures. - return; - } + $function = $phpcsFile->getCondition($stackPtr, T_FUNCTION); + if ($function === false) { + // Not a nested function. + return; + } + + $class = $phpcsFile->getCondition($stackPtr, T_ANON_CLASS); + if ($class !== false && $class > $function) { + // Ignore methods in anon classes. + return; + } - $error = 'The use of inner functions is forbidden'; - $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); + $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); + if ($tokens[$prev]['code'] === T_EQUAL) { + // Ignore closures. + return; } + $error = 'The use of inner functions is forbidden'; + $phpcsFile->addError($error, $stackPtr, 'NotAllowed'); + }//end process() diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php index 57d4b197..ed9106d7 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/LowercasePHPFunctionsSniff.php @@ -30,6 +30,25 @@ class Squiz_Sniffs_PHP_LowercasePHPFunctionsSniff implements PHP_CodeSniffer_Sniff { + /** + * String -> int hash map of all php built in function names + * + * @var array + */ + private $_builtInFunctions; + + + /** + * Construct the LowercasePHPFunctionSniff + */ + public function __construct() + { + + $allFunctions = get_defined_functions(); + $this->_builtInFunctions = array_flip($allFunctions['internal']); + + }//end __construct() + /** * Returns an array of tokens this test wants to listen for. @@ -95,11 +114,10 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) } // Make sure it is an inbuilt PHP function. - // PHP_CodeSniffer doesn't include/require any files, so no - // user defined global functions can exist, except for - // PHP_CodeSniffer ones. + // PHP_CodeSniffer can possibly include user defined functions + // through the use of vendor/autoload.php. $content = $tokens[$stackPtr]['content']; - if (function_exists($content) === false) { + if (isset($this->_builtInFunctions[strtolower($content)]) === false) { return; } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php index e05887ef..8b44e481 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/PHP/NonExecutableCodeSniff.php @@ -66,7 +66,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) // If this token is preceded with an "or", it only relates to one line // and should be ignored. For example: fopen() or die(). $prev = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr - 1), null, true); - if ($tokens[$prev]['code'] === T_LOGICAL_OR) { + if ($tokens[$prev]['code'] === T_LOGICAL_OR || $tokens[$prev]['code'] === T_BOOLEAN_OR) { return; } @@ -111,19 +111,19 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $owner = $tokens[$stackPtr]['scope_condition']; if ($tokens[$owner]['code'] === T_CASE || $tokens[$owner]['code'] === T_DEFAULT) { // This token closes the scope of a CASE or DEFAULT statement - // so any code between this token and the next CASE, DEFAULT or + // so any code between this statement and the next CASE, DEFAULT or // end of SWITCH token will not be executable. + $end = $phpcsFile->findEndOfStatement($stackPtr); $next = $phpcsFile->findNext( array( T_CASE, T_DEFAULT, T_CLOSE_CURLY_BRACKET, ), - ($stackPtr + 1) + ($end + 1) ); if ($next !== false) { - $end = $phpcsFile->findNext(array(T_SEMICOLON), ($stackPtr + 1)); $lastLine = $tokens[$end]['line']; for ($i = ($stackPtr + 1); $i < $next; $i++) { if (isset(PHP_CodeSniffer_Tokens::$emptyTokens[$tokens[$i]['code']]) === true) { diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php index a41bd5c5..f5cc07c1 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/MemberVarSpacingSniff.php @@ -63,6 +63,12 @@ protected function processMemberVar(PHP_CodeSniffer_File $phpcsFile, $stackPtr) $fix = $phpcsFile->addFixableError($error, $prev, 'AfterComment', $data); if ($fix === true) { $phpcsFile->fixer->beginChangeset(); + // Inline comments have the newline included in the content but + // docblock do not. + if ($tokens[$prev]['code'] === T_COMMENT) { + $phpcsFile->fixer->replaceToken($prev, rtrim($tokens[$prev]['content'])); + } + for ($i = ($prev + 1); $i <= $stackPtr; $i++) { if ($tokens[$i]['line'] === $tokens[$stackPtr]['line']) { break; diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php index c962aad1..ec64e5e8 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php @@ -187,7 +187,7 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) return; }//end if - if ($tokens[$stackPtr]['code'] === T_MINUS) { + if ($tokens[$stackPtr]['code'] === T_MINUS || $tokens[$stackPtr]['code'] === T_PLUS) { // Check minus spacing, but make sure we aren't just assigning // a minus value or returning one. $prev = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/CSS.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/CSS.php index 6b67e447..a92b02b6 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/CSS.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/CSS.php @@ -30,6 +30,13 @@ class PHP_CodeSniffer_Tokenizers_CSS extends PHP_CodeSniffer_Tokenizers_PHP { + /** + * If TRUE, files that appear to be minified will not be processed. + * + * @var boolean + */ + public $skipMinified = true; + /** * Creates an array of tokens when given some CSS code. diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/Comment.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/Comment.php index a54ca133..5df17810 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/Comment.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/Comment.php @@ -108,7 +108,6 @@ public function tokenizeString($string, $eolChar, $stackPtr) $stackPtr++; if (PHP_CODESNIFFER_VERBOSITY > 1) { $content = PHP_CodeSniffer::prepareForOutput($space['content']); - $type = $lineToken['type']; echo "\t\tCreate comment token: T_DOC_COMMENT_WHITESPACE => $content".PHP_EOL; } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/JS.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/JS.php index e7890cdd..302fe46f 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/JS.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/JS.php @@ -27,6 +27,13 @@ class PHP_CodeSniffer_Tokenizers_JS { + /** + * If TRUE, files that appear to be minified will not be processed. + * + * @var boolean + */ + public $skipMinified = true; + /** * A list of tokens that are allowed to open a scope. * @@ -814,16 +821,15 @@ public function tokenizeString($string, $eolChar='\n') if ($newContent !== '' && $newContent !== '.') { $finalTokens[($newStackPtr - 1)]['content'] = $newContent; if (ctype_digit($newContent) === true) { - $finalTokens[($newStackPtr - 1)]['code'] - = constant('T_LNUMBER'); + $finalTokens[($newStackPtr - 1)]['code'] = constant('T_LNUMBER'); $finalTokens[($newStackPtr - 1)]['type'] = 'T_LNUMBER'; } else { - $finalTokens[($newStackPtr - 1)]['code'] - = constant('T_DNUMBER'); + $finalTokens[($newStackPtr - 1)]['code'] = constant('T_DNUMBER'); $finalTokens[($newStackPtr - 1)]['type'] = 'T_DNUMBER'; } $stackPtr--; + continue; } else { $stackPtr = $oldStackPtr; } @@ -885,6 +891,8 @@ public function getRegexToken($char, $string, $chars, $tokens, $eolChar) T_COMMA => true, T_COLON => true, T_TYPEOF => true, + T_INLINE_THEN => true, + T_INLINE_ELSE => true, ); $afterTokens = array( @@ -894,6 +902,7 @@ public function getRegexToken($char, $string, $chars, $tokens, $eolChar) ';' => true, ' ' => true, '.' => true, + ':' => true, $eolChar => true, ); diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php index b96adeb0..0a9ddd6c 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokenizers/PHP.php @@ -26,6 +26,13 @@ class PHP_CodeSniffer_Tokenizers_PHP { + /** + * If TRUE, files that appear to be minified will not be processed. + * + * @var boolean + */ + public $skipMinified = false; + /** * A list of tokens that are allowed to open a scope. * @@ -324,6 +331,7 @@ public function tokenizeString($string, $eolChar='\n') $lastNotEmptyToken = 0; $insideInlineIf = array(); + $insideUseGroup = false; $commentTokenizer = new PHP_CodeSniffer_Tokenizers_Comment(); @@ -500,8 +508,6 @@ public function tokenizeString($string, $eolChar='\n') $nowdoc = true; } - $newStackPtr++; - $tokenContent = ''; for ($i = ($stackPtr + 1); $i < $numTokens; $i++) { $subTokenIsArray = is_array($tokens[$i]); @@ -519,7 +525,24 @@ public function tokenizeString($string, $eolChar='\n') } } + if ($i === $numTokens) { + // We got to the end of the file and never + // found the closing token, so this probably wasn't + // a heredoc. + if (PHP_CODESNIFFER_VERBOSITY > 1) { + $type = $finalTokens[$newStackPtr]['type']; + echo "\t\t* failed to find the end of the here/nowdoc".PHP_EOL; + echo "\t\t* token $stackPtr changed from $type to T_STRING".PHP_EOL; + } + + $finalTokens[$newStackPtr]['code'] = T_STRING; + $finalTokens[$newStackPtr]['type'] = 'T_STRING'; + $newStackPtr++; + continue; + } + $stackPtr = $i; + $newStackPtr++; // Convert each line within the heredoc to a // new token, so it conforms with other multiple line tokens. @@ -610,6 +633,51 @@ public function tokenizeString($string, $eolChar='\n') continue; } + /* + Before PHP 5.6, the **= operator was tokenized as + T_MULTIPLY followed by T_MUL_EQUAL. So look for and combine + these tokens in earlier versions. + */ + + if ($tokenIsArray === false + && $token[0] === '*' + && isset($tokens[($stackPtr + 1)]) === true + && is_array($tokens[($stackPtr + 1)]) === true + && $tokens[($stackPtr + 1)][1] === '*=' + ) { + $newToken = array(); + $newToken['code'] = T_POW_EQUAL; + $newToken['type'] = 'T_POW_EQUAL'; + $newToken['content'] = '**='; + $finalTokens[$newStackPtr] = $newToken; + + $newStackPtr++; + $stackPtr++; + continue; + } + + /* + Before PHP 7, the ?? operator was tokenized as + T_INLINE_THEN followed by T_INLINE_THEN. + So look for and combine these tokens in earlier versions. + */ + + if ($tokenIsArray === false + && $token[0] === '?' + && isset($tokens[($stackPtr + 1)]) === true + && $tokens[($stackPtr + 1)][0] === '?' + ) { + $newToken = array(); + $newToken['code'] = T_COALESCE; + $newToken['type'] = 'T_COALESCE'; + $newToken['content'] = '??'; + $finalTokens[$newStackPtr] = $newToken; + + $newStackPtr++; + $stackPtr++; + continue; + } + /* Before PHP 7, the <=> operator was tokenized as T_IS_SMALLER_OR_EQUAL followed by T_GREATER_THAN. @@ -665,6 +733,7 @@ public function tokenizeString($string, $eolChar='\n') if ($tokenIsArray === true && $token[0] === T_STRING + && isset($tokens[($stackPtr + 1)]) === true && $tokens[($stackPtr + 1)] === ':' && $tokens[($stackPtr - 1)][0] !== T_PAAMAYIM_NEKUDOTAYIM ) { @@ -895,6 +964,23 @@ public function tokenizeString($string, $eolChar='\n') $newToken['type'] = 'T_STRING'; } + // This is a special case for use groups in PHP 7+ where leaving + // the curly braces as their normal tokens would confuse + // the scope map and sniffs. + if ($newToken['code'] === T_OPEN_CURLY_BRACKET + && $finalTokens[$lastNotEmptyToken]['code'] === T_NS_SEPARATOR + ) { + $newToken['code'] = T_OPEN_USE_GROUP; + $newToken['type'] = 'T_OPEN_USE_GROUP'; + $insideUseGroup = true; + } + + if ($insideUseGroup === true && $newToken['code'] === T_CLOSE_CURLY_BRACKET) { + $newToken['code'] = T_CLOSE_USE_GROUP; + $newToken['type'] = 'T_CLOSE_USE_GROUP'; + $insideUseGroup = false; + } + $finalTokens[$newStackPtr] = $newToken; $newStackPtr++; }//end if @@ -941,13 +1027,19 @@ public function processAdditional(&$tokens, $eolChar) if ($tokens[$i]['code'] === T_FUNCTION) { // Context sensitive keywords support. - for ($x = ($i + 1); $i < $numTokens; $x++) { + for ($x = ($i + 1); $x < $numTokens; $x++) { if (isset(PHP_CodeSniffer_Tokens::$emptyTokens[$tokens[$x]['code']]) === false) { // Non-whitespace content. break; } } + if ($x === $numTokens) { + // We got to the end without finding any more + // non-whitespace content. + continue; + } + if (in_array($tokens[$x]['code'], array(T_STRING, T_OPEN_PARENTHESIS, T_BITWISE_AND), true) === false) { if (PHP_CODESNIFFER_VERBOSITY > 1) { $line = $tokens[$x]['line']; @@ -996,12 +1088,18 @@ public function processAdditional(&$tokens, $eolChar) $tokenAfterReturnTypeHint = $tokens[$i]['scope_opener']; } else if (isset($tokens[$i]['parenthesis_closer']) === true) { - for ($x = ($tokens[$i]['parenthesis_closer'] + 1); $i < $numTokens; $x++) { + $tokenAfterReturnTypeHint = null; + for ($x = ($tokens[$i]['parenthesis_closer'] + 1); $x < $numTokens; $x++) { if ($tokens[$x]['code'] === T_SEMICOLON) { $tokenAfterReturnTypeHint = $x; break; } } + + if ($tokenAfterReturnTypeHint === null) { + // Probably a syntax error. + continue; + } } else { // Probably a syntax error. continue; @@ -1014,7 +1112,7 @@ public function processAdditional(&$tokens, $eolChar) for ($x = ($tokenAfterReturnTypeHint - 1); $x > $i; $x--) { if (isset(PHP_CodeSniffer_Tokens::$emptyTokens[$tokens[$x]['code']]) === false) { - if ($tokens[$x]['code'] === T_STRING || $tokens[$x]['code'] === T_ARRAY) { + if (in_array($tokens[$x]['code'], array(T_STRING, T_ARRAY, T_CALLABLE, T_SELF, T_PARENT), true) === true) { if (PHP_CODESNIFFER_VERBOSITY > 1) { $line = $tokens[$x]['line']; $type = $tokens[$x]['type']; @@ -1043,6 +1141,8 @@ public function processAdditional(&$tokens, $eolChar) if ($tokens[$x]['code'] === T_OPEN_PARENTHESIS || $tokens[$x]['code'] === T_OPEN_CURLY_BRACKET + || $tokens[$x]['code'] === T_EXTENDS + || $tokens[$x]['code'] === T_IMPLEMENTS ) { $tokens[$i]['code'] = T_ANON_CLASS; $tokens[$i]['type'] = 'T_ANON_CLASS'; @@ -1215,11 +1315,11 @@ public function processAdditional(&$tokens, $eolChar) } } - if ($tokens[$x]['code'] === T_CASE) { + if ($tokens[$x]['code'] === T_CASE || $tokens[$x]['code'] === T_DEFAULT) { // Special case for multiple CASE statements that share the same // closer. Because we are going backwards through the file, this next - // CASE statement is already fixed, so just use its closer and don't - // worry about fixing anything. + // CASE/DEFAULT statement is already fixed, so just use its closer + // and don't worry about fixing anything. $newCloser = $tokens[$x]['scope_closer']; $tokens[$i]['scope_closer'] = $newCloser; if (PHP_CODESNIFFER_VERBOSITY > 1) { @@ -1235,7 +1335,7 @@ public function processAdditional(&$tokens, $eolChar) if ($tokens[$x]['code'] !== T_OPEN_CURLY_BRACKET || isset($tokens[$x]['scope_condition']) === true ) { - // Not a CASE with a curly brace opener. + // Not a CASE/DEFAULT with a curly brace opener. continue; } diff --git a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokens.php b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokens.php index d53d69d3..b112c0b2 100644 --- a/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokens.php +++ b/vendor/squizlabs/php_codesniffer/CodeSniffer/Tokens.php @@ -73,6 +73,8 @@ define('T_BINARY_CAST', 'PHPCS_T_BINARY_CAST'); define('T_EMBEDDED_PHP', 'PHPCS_T_EMBEDDED_PHP'); define('T_RETURN_TYPE', 'PHPCS_T_RETURN_TYPE'); +define('T_OPEN_USE_GROUP', 'PHPCS_T_OPEN_USE_GROUP'); +define('T_CLOSE_USE_GROUP', 'PHPCS_T_CLOSE_USE_GROUP'); // Some PHP 5.3 tokens, replicated for lower versions. if (defined('T_NAMESPACE') === false) { @@ -130,11 +132,19 @@ define('T_POW', 'PHPCS_T_POW'); } +if (defined('T_POW_EQUAL') === false) { + define('T_POW_EQUAL', 'PHPCS_T_POW_EQUAL'); +} + // Some PHP 7 tokens, replicated for lower versions. if (defined('T_SPACESHIP') === false) { define('T_SPACESHIP', 'PHPCS_T_SPACESHIP'); } +if (defined('T_COALESCE') === false) { + define('T_COALESCE', 'PHPCS_T_COALESCE'); +} + // Tokens used for parsing doc blocks. define('T_DOC_COMMENT_STAR', 'PHPCS_T_DOC_COMMENT_STAR'); define('T_DOC_COMMENT_WHITESPACE', 'PHPCS_T_DOC_COMMENT_WHITESPACE'); @@ -209,6 +219,7 @@ final class PHP_CodeSniffer_Tokens T_MODULUS => 5, T_POW => 5, T_SPACESHIP => 5, + T_COALESCE => 5, T_SL => 5, T_SR => 5, @@ -317,6 +328,7 @@ final class PHP_CodeSniffer_Tokens T_LOGICAL_XOR => 3, T_METHOD_C => 10, T_MINUS_EQUAL => 2, + T_POW_EQUAL => 3, T_MOD_EQUAL => 2, T_MUL_EQUAL => 2, T_NAMESPACE => 9, @@ -368,6 +380,7 @@ final class PHP_CodeSniffer_Tokens T_MODULUS => 1, T_POW => 2, T_SPACESHIP => 3, + T_COALESCE => 2, T_BITWISE_AND => 1, T_BITWISE_OR => 1, T_BITWISE_XOR => 1, @@ -397,9 +410,11 @@ final class PHP_CodeSniffer_Tokens public static $assignmentTokens = array( T_EQUAL => T_EQUAL, T_AND_EQUAL => T_AND_EQUAL, + T_OR_EQUAL => T_OR_EQUAL, T_CONCAT_EQUAL => T_CONCAT_EQUAL, T_DIV_EQUAL => T_DIV_EQUAL, T_MINUS_EQUAL => T_MINUS_EQUAL, + T_POW_EQUAL => T_POW_EQUAL, T_MOD_EQUAL => T_MOD_EQUAL, T_MUL_EQUAL => T_MUL_EQUAL, T_PLUS_EQUAL => T_PLUS_EQUAL, @@ -493,29 +508,30 @@ final class PHP_CodeSniffer_Tokens * @var array(int) */ public static $scopeOpeners = array( - T_CLASS => T_CLASS, - T_INTERFACE => T_INTERFACE, - T_TRAIT => T_TRAIT, - T_NAMESPACE => T_NAMESPACE, - T_FUNCTION => T_FUNCTION, - T_CLOSURE => T_CLOSURE, - T_IF => T_IF, - T_SWITCH => T_SWITCH, - T_CASE => T_CASE, - T_DECLARE => T_DECLARE, - T_DEFAULT => T_DEFAULT, - T_WHILE => T_WHILE, - T_ELSE => T_ELSE, - T_ELSEIF => T_ELSEIF, - T_FOR => T_FOR, - T_FOREACH => T_FOREACH, - T_DO => T_DO, - T_TRY => T_TRY, - T_CATCH => T_CATCH, - T_FINALLY => T_FINALLY, - T_PROPERTY => T_PROPERTY, - T_OBJECT => T_OBJECT, - T_USE => T_USE, + T_CLASS => T_CLASS, + T_ANON_CLASS => T_ANON_CLASS, + T_INTERFACE => T_INTERFACE, + T_TRAIT => T_TRAIT, + T_NAMESPACE => T_NAMESPACE, + T_FUNCTION => T_FUNCTION, + T_CLOSURE => T_CLOSURE, + T_IF => T_IF, + T_SWITCH => T_SWITCH, + T_CASE => T_CASE, + T_DECLARE => T_DECLARE, + T_DEFAULT => T_DEFAULT, + T_WHILE => T_WHILE, + T_ELSE => T_ELSE, + T_ELSEIF => T_ELSEIF, + T_FOR => T_FOR, + T_FOREACH => T_FOREACH, + T_DO => T_DO, + T_TRY => T_TRY, + T_CATCH => T_CATCH, + T_FINALLY => T_FINALLY, + T_PROPERTY => T_PROPERTY, + T_OBJECT => T_OBJECT, + T_USE => T_USE, ); /** @@ -556,6 +572,7 @@ final class PHP_CodeSniffer_Tokens T_MODULUS => T_MODULUS, T_POW => T_POW, T_SPACESHIP => T_SPACESHIP, + T_COALESCE => T_COALESCE, T_BITWISE_AND => T_BITWISE_AND, T_BITWISE_OR => T_BITWISE_OR, T_BITWISE_XOR => T_BITWISE_XOR, diff --git a/vendor/squizlabs/php_codesniffer/README.md b/vendor/squizlabs/php_codesniffer/README.md index 0cb82ae1..3123ee1a 100644 --- a/vendor/squizlabs/php_codesniffer/README.md +++ b/vendor/squizlabs/php_codesniffer/README.md @@ -50,9 +50,9 @@ You will then be able to run PHP_CodeSniffer from the vendor bin directory: ./vendor/bin/phpcs -h ./vendor/bin/phpcbf -h -You can also download the PHP\_CodeSniffer source and run the `phpcs` and `phpcbf` commands directly from the Git checkout: +You can also download the PHP\_CodeSniffer source and run the `phpcs` and `phpcbf` commands directly from the Git clone: - git clone git://github.com/squizlabs/PHP_CodeSniffer.git + git clone https://github.com/squizlabs/PHP_CodeSniffer.git cd PHP_CodeSniffer php scripts/phpcs -h php scripts/phpcbf -h diff --git a/vendor/squizlabs/php_codesniffer/composer.json b/vendor/squizlabs/php_codesniffer/composer.json index 0dff7923..9199c1ad 100644 --- a/vendor/squizlabs/php_codesniffer/composer.json +++ b/vendor/squizlabs/php_codesniffer/composer.json @@ -54,7 +54,8 @@ "require": { "php": ">=5.1.2", "ext-tokenizer": "*", - "ext-xmlwriter": "*" + "ext-xmlwriter": "*", + "ext-simplexml": "*" }, "require-dev": { "phpunit/phpunit": "~4.0" diff --git a/vendor/squizlabs/php_codesniffer/phpcs.xml.dist b/vendor/squizlabs/php_codesniffer/phpcs.xml.dist index 8c35a7d3..85b313e0 100644 --- a/vendor/squizlabs/php_codesniffer/phpcs.xml.dist +++ b/vendor/squizlabs/php_codesniffer/phpcs.xml.dist @@ -8,7 +8,6 @@ */Tests/* - diff --git a/vendor/symfony/yaml/Dumper.php b/vendor/symfony/yaml/Dumper.php index 39cdcfc5..05817f5d 100644 --- a/vendor/symfony/yaml/Dumper.php +++ b/vendor/symfony/yaml/Dumper.php @@ -28,10 +28,14 @@ class Dumper /** * Sets the indentation. * - * @param int $num The amount of spaces to use for indentation of nested nodes. + * @param int $num The amount of spaces to use for indentation of nested nodes */ public function setIndentation($num) { + if ($num < 1) { + throw new \InvalidArgumentException('The indentation must be greater than zero.'); + } + $this->indentation = (int) $num; } @@ -54,7 +58,7 @@ public function dump($input, $inline = 0, $indent = 0, $exceptionOnInvalidType = if ($inline <= 0 || !is_array($input) || empty($input)) { $output .= $prefix.Inline::dump($input, $exceptionOnInvalidType, $objectSupport); } else { - $isAHash = array_keys($input) !== range(0, count($input) - 1); + $isAHash = Inline::isHash($input); foreach ($input as $key => $value) { $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value); diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php index 7bac8dde..a74f14dd 100644 --- a/vendor/symfony/yaml/Escaper.php +++ b/vendor/symfony/yaml/Escaper.php @@ -46,7 +46,7 @@ class Escaper * * @param string $value A PHP value * - * @return bool True if the value would require double quotes. + * @return bool True if the value would require double quotes */ public static function requiresDoubleQuoting($value) { @@ -70,7 +70,7 @@ public static function escapeWithDoubleQuotes($value) * * @param string $value A PHP value * - * @return bool True if the value would require single quotes. + * @return bool True if the value would require single quotes */ public static function requiresSingleQuoting($value) { diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php index bb2db360..717cbfd5 100644 --- a/vendor/symfony/yaml/Inline.php +++ b/vendor/symfony/yaml/Inline.php @@ -157,6 +157,28 @@ public static function dump($value, $exceptionOnInvalidType = false, $objectSupp } } + /** + * Check if given array is hash or just normal indexed array. + * + * @internal + * + * @param array $value The PHP array to check + * + * @return bool true if value is hash array, false otherwise + */ + public static function isHash(array $value) + { + $expectedKey = 0; + + foreach ($value as $key => $val) { + if ($key !== $expectedKey++) { + return true; + } + } + + return false; + } + /** * Dumps a PHP array to a YAML string. * @@ -169,11 +191,7 @@ public static function dump($value, $exceptionOnInvalidType = false, $objectSupp private static function dumpArray($value, $exceptionOnInvalidType, $objectSupport) { // array - $keys = array_keys($value); - $keysCount = count($keys); - if ((1 === $keysCount && '0' == $keys[0]) - || ($keysCount > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) === $keysCount * ($keysCount - 1) / 2) - ) { + if ($value && !self::isHash($value)) { $output = array(); foreach ($value as $val) { $output[] = self::dump($val, $exceptionOnInvalidType, $objectSupport); @@ -182,7 +200,7 @@ private static function dumpArray($value, $exceptionOnInvalidType, $objectSuppor return sprintf('[%s]', implode(', ', $output)); } - // mapping + // hash $output = array(); foreach ($value as $key => $val) { $output[] = sprintf('%s: %s', self::dump($key, $exceptionOnInvalidType, $objectSupport), self::dump($val, $exceptionOnInvalidType, $objectSupport)); diff --git a/vendor/symfony/yaml/Parser.php b/vendor/symfony/yaml/Parser.php index 41134e6b..7cdb9643 100644 --- a/vendor/symfony/yaml/Parser.php +++ b/vendor/symfony/yaml/Parser.php @@ -25,19 +25,26 @@ class Parser const FOLDED_SCALAR_PATTERN = self::BLOCK_SCALAR_HEADER_PATTERN; private $offset = 0; + private $totalNumberOfLines; private $lines = array(); private $currentLineNb = -1; private $currentLine = ''; private $refs = array(); + private $skippedLineNumbers = array(); + private $locallySkippedLineNumbers = array(); /** * Constructor. * - * @param int $offset The offset of YAML document (used for line numbers in error messages) + * @param int $offset The offset of YAML document (used for line numbers in error messages) + * @param int|null $totalNumberOfLines The overall number of lines being parsed + * @param int[] $skippedLineNumbers Number of comment lines that have been skipped by the parser */ - public function __construct($offset = 0) + public function __construct($offset = 0, $totalNumberOfLines = null, array $skippedLineNumbers = array()) { $this->offset = $offset; + $this->totalNumberOfLines = $totalNumberOfLines; + $this->skippedLineNumbers = $skippedLineNumbers; } /** @@ -62,6 +69,10 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = $value = $this->cleanup($value); $this->lines = explode("\n", $value); + if (null === $this->totalNumberOfLines) { + $this->totalNumberOfLines = count($this->lines); + } + if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) { $mbEncoding = mb_internal_encoding(); mb_internal_encoding('UTF-8'); @@ -83,7 +94,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = $isRef = $mergeNode = false; if (preg_match('#^\-((?P\s+)(?P.+?))?\s*$#u', $this->currentLine, $values)) { if ($context && 'mapping' == $context) { - throw new ParseException('You cannot define a sequence item when in a mapping'); + throw new ParseException('You cannot define a sequence item when in a mapping', $this->getRealCurrentLineNb() + 1, $this->currentLine); } $context = 'sequence'; @@ -94,25 +105,18 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = // array if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new self($c); - $parser->refs = &$this->refs; - $data[] = $parser->parse($this->getNextEmbedBlock(null, true), $exceptionOnInvalidType, $objectSupport, $objectForMap); + $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $exceptionOnInvalidType, $objectSupport, $objectForMap); } else { if (isset($values['leadspaces']) && preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P.+?))?\s*$#u', $values['value'], $matches) ) { // this is a compact notation element, add to next block and parse - $c = $this->getRealCurrentLineNb(); - $parser = new self($c); - $parser->refs = &$this->refs; - $block = $values['value']; if ($this->isNextLineIndented()) { $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1); } - $data[] = $parser->parse($block, $exceptionOnInvalidType, $objectSupport, $objectForMap); + $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $exceptionOnInvalidType, $objectSupport, $objectForMap); } else { $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap, $context); } @@ -122,7 +126,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = } } elseif (preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P.+?))?\s*$#u', $this->currentLine, $values) && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'")))) { if ($context && 'sequence' == $context) { - throw new ParseException('You cannot define a mapping item when in a sequence'); + throw new ParseException('You cannot define a mapping item when in a sequence', $this->currentLineNb + 1, $this->currentLine); } $context = 'mapping'; @@ -168,10 +172,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = } else { $value = $this->getNextEmbedBlock(); } - $c = $this->getRealCurrentLineNb() + 1; - $parser = new self($c); - $parser->refs = &$this->refs; - $parsed = $parser->parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap); + $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $exceptionOnInvalidType, $objectSupport, $objectForMap); if (!is_array($parsed)) { throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine); @@ -219,10 +220,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = $data[$key] = null; } } else { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new self($c); - $parser->refs = &$this->refs; - $value = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport, $objectForMap); + $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport, $objectForMap); // Spec: Keys MUST be unique; first one wins. // But overwriting is allowed when a merge node is used in current block. if ($allowOverwrite || !isset($data[$key])) { @@ -243,7 +241,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = } else { // multiple documents are not supported if ('---' === $this->currentLine) { - throw new ParseException('Multiple documents are not supported.'); + throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine); } // 1-liner optionally followed by newline(s) @@ -316,6 +314,24 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = return empty($data) ? null : $data; } + private function parseBlock($offset, $yaml, $exceptionOnInvalidType, $objectSupport, $objectForMap) + { + $skippedLineNumbers = $this->skippedLineNumbers; + + foreach ($this->locallySkippedLineNumbers as $lineNumber) { + if ($lineNumber < $offset) { + continue; + } + + $skippedLineNumbers[] = $lineNumber; + } + + $parser = new self($offset, $this->totalNumberOfLines, $skippedLineNumbers); + $parser->refs = &$this->refs; + + return $parser->parse($yaml, $exceptionOnInvalidType, $objectSupport, $objectForMap); + } + /** * Returns the current line number (takes the offset into account). * @@ -323,7 +339,17 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport = */ private function getRealCurrentLineNb() { - return $this->currentLineNb + $this->offset; + $realCurrentLineNumber = $this->currentLineNb + $this->offset; + + foreach ($this->skippedLineNumbers as $skippedLineNumber) { + if ($skippedLineNumber > $realCurrentLineNumber) { + break; + } + + ++$realCurrentLineNumber; + } + + return $realCurrentLineNumber; } /** @@ -426,6 +452,14 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false) // we ignore "comment" lines only when we are not inside a scalar block if (empty($blockScalarIndentations) && $this->isCurrentLineComment()) { + // remember ignored comment lines (they are used later in nested + // parser calls to determine real line numbers) + // + // CAUTION: beware to not populate the global property here as it + // will otherwise influence the getRealCurrentLineNb() call here + // for consecutive comment lines and subsequent embedded blocks + $this->locallySkippedLineNumbers[] = $this->getRealCurrentLineNb(); + continue; } @@ -461,10 +495,18 @@ private function moveToNextLine() /** * Moves the parser to the previous line. + * + * @return bool */ private function moveToPreviousLine() { + if ($this->currentLineNb < 1) { + return false; + } + $this->currentLine = $this->lines[--$this->currentLineNb]; + + return true; } /** @@ -490,7 +532,7 @@ private function parseValue($value, $exceptionOnInvalidType, $objectSupport, $ob } if (!array_key_exists($value, $this->refs)) { - throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLine); + throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine); } return $this->refs[$value]; @@ -585,6 +627,8 @@ private function parseBlockScalar($style, $chomping = '', $indentation = 0) if ($notEOF) { $blockLines[] = ''; $this->moveToPreviousLine(); + } elseif (!$notEOF && !$this->isCurrentLineLastLineInDocument()) { + $blockLines[] = ''; } // folded style @@ -691,6 +735,11 @@ private function isCurrentLineComment() return '' !== $ltrimmedLine && $ltrimmedLine[0] === '#'; } + private function isCurrentLineLastLineInDocument() + { + return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1); + } + /** * Cleanups a YAML string to be parsed. * @@ -768,7 +817,7 @@ private function isNextLineUnIndentedCollection() */ private function isStringUnIndentedCollectionItem() { - return 0 === strpos($this->currentLine, '- '); + return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- '); } /** diff --git a/vendor/symfony/yaml/README.md b/vendor/symfony/yaml/README.md index 85a97867..0d324881 100644 --- a/vendor/symfony/yaml/README.md +++ b/vendor/symfony/yaml/README.md @@ -1,21 +1,13 @@ Yaml Component ============== -YAML implements most of the YAML 1.2 specification. - -```php -use Symfony\Component\Yaml\Yaml; - -$array = Yaml::parse(file_get_contents(filename)); - -print Yaml::dump($array); -``` +The Yaml component loads and dumps YAML files. Resources --------- -You can run the unit tests with the following command: - - $ cd path/to/Symfony/Component/Yaml/ - $ composer install - $ phpunit + * [Documentation](https://symfony.com/doc/current/components/yaml/index.html) + * [Contributing](https://symfony.com/doc/current/contributing/index.html) + * [Report issues](https://github.com/symfony/symfony/issues) and + [send Pull Requests](https://github.com/symfony/symfony/pulls) + in the [main Symfony repository](https://github.com/symfony/symfony) diff --git a/vendor/symfony/yaml/Tests/DumperTest.php b/vendor/symfony/yaml/Tests/DumperTest.php index 2a0df692..84069d8a 100644 --- a/vendor/symfony/yaml/Tests/DumperTest.php +++ b/vendor/symfony/yaml/Tests/DumperTest.php @@ -228,6 +228,24 @@ public function getEscapeSequences() 'paragraph-separator' => array("\t\\P", '"\t\\\\P"'), ); } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testZeroIndentationThrowsException() + { + $this->dumper->setIndentation(0); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testNegativeIndentationThrowsException() + { + $this->dumper->setIndentation(-4); + } } class A diff --git a/vendor/symfony/yaml/Tests/InlineTest.php b/vendor/symfony/yaml/Tests/InlineTest.php index f0f9b96b..e349bfcc 100644 --- a/vendor/symfony/yaml/Tests/InlineTest.php +++ b/vendor/symfony/yaml/Tests/InlineTest.php @@ -220,6 +220,24 @@ public function getScalarIndicators() return array(array('|'), array('>')); } + /** + * @dataProvider getDataForIsHash + */ + public function testIsHash($array, $expected) + { + $this->assertSame($expected, Inline::isHash($array)); + } + + public function getDataForIsHash() + { + return array( + array(array(), false), + array(array(1, 2, 3), false), + array(array(2 => 1, 1 => 2, 0 => 3), true), + array(array('foo' => 1, 'bar' => 2), true), + ); + } + public function getTestsForParse() { return array( @@ -426,6 +444,8 @@ public function getTestsForDump() array('[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]', array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo')))), array('[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, '@service_container')), + + array('{ foo: { bar: { 1: 2, baz: 3 } } }', array('foo' => array('bar' => array(1 => 2, 'baz' => 3)))), ); } } diff --git a/vendor/symfony/yaml/Tests/ParserTest.php b/vendor/symfony/yaml/Tests/ParserTest.php index d41c583e..9e9a715a 100644 --- a/vendor/symfony/yaml/Tests/ParserTest.php +++ b/vendor/symfony/yaml/Tests/ParserTest.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Yaml\Tests; +use Symfony\Bridge\PhpUnit\ErrorAssert; use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Parser; @@ -596,7 +597,7 @@ public function testShortcutKeyUnindentedCollectionException() /** * @expectedException \Symfony\Component\Yaml\Exception\ParseException - * @expectedExceptionMessage Multiple documents are not supported. + * @expectedExceptionMessageRegExp /^Multiple documents are not supported.+/ */ public function testMultipleDocumentsNotSupportedException() { @@ -628,6 +629,53 @@ public function testSequenceInAMapping() ); } + public function testSequenceInMappingStartedBySingleDashLine() + { + $yaml = << array( + array( + 'b' => array( + array( + 'bar' => 'baz', + ), + ), + ), + 'foo', + ), + 'd' => 'e', + ); + + $this->assertSame($expected, $this->parser->parse($yaml)); + } + + public function testSequenceFollowedByCommentEmbeddedInMapping() + { + $yaml = << array( + 'b' => array('c'), + 'd' => 'e', + ), + ); + + $this->assertSame($expected, $this->parser->parse($yaml)); + } + /** * @expectedException \Symfony\Component\Yaml\Exception\ParseException */ @@ -880,26 +928,18 @@ public function testFloatKeys() /** * @group legacy * throw ParseException in Symfony 3.0 + * @requires function Symfony\Bridge\PhpUnit\ErrorAssert::assertDeprecationsAreTriggered */ public function testColonInMappingValueException() { - $yaml = <<parser; + + ErrorAssert::assertDeprecationsAreTriggered('Using a colon in the unquoted mapping value "bar: baz" in line 1 is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', function () use ($parser) { + $yaml = <<parse($yaml); }); - - $this->parser->parse($yaml); - - restore_error_handler(); - - $this->assertCount(1, $deprecations); - $this->assertContains('Using a colon in the unquoted mapping value "bar: baz" in line 1 is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', $deprecations[0]); } public function testColonInMappingValueExceptionNotTriggeredByColonInComment() @@ -989,6 +1029,7 @@ public function getCommentLikeStringInScalarBlockData() foo # bar baz + EOT , ), @@ -1017,7 +1058,7 @@ public function getCommentLikeStringInScalarBlockData() $expected = array( 'foo' => array( 'bar' => array( - 'scalar-block' => 'line1 line2>', + 'scalar-block' => "line1 line2>\n", ), 'baz' => array( 'foobar' => null, @@ -1095,6 +1136,74 @@ public function testAdditionallyIndentedLinesAreParsedAsNewLinesInFoldedBlocks() $this->parser->parse($yaml) ); } + + /** + * @param $lineNumber + * @param $yaml + * @dataProvider parserThrowsExceptionWithCorrectLineNumberProvider + */ + public function testParserThrowsExceptionWithCorrectLineNumber($lineNumber, $yaml) + { + $this->setExpectedException( + '\Symfony\Component\Yaml\Exception\ParseException', + sprintf('Unexpected characters near "," at line %d (near "bar: "123",").', $lineNumber) + ); + + $this->parser->parse($yaml); + } + + public function parserThrowsExceptionWithCorrectLineNumberProvider() + { + return array( + array( + 4, + <<assertEquals($parsedByFilename, $parsedByContents); } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testZeroIndentationThrowsException() + { + Yaml::dump(array('lorem' => 'ipsum', 'dolor' => 'sit'), 2, 0); + } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage The indentation must be greater than zero + */ + public function testNegativeIndentationThrowsException() + { + Yaml::dump(array('lorem' => 'ipsum', 'dolor' => 'sit'), 2, -4); + } } diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php index bb330161..1e02cc9f 100644 --- a/vendor/symfony/yaml/Unescaper.php +++ b/vendor/symfony/yaml/Unescaper.php @@ -39,9 +39,9 @@ class Unescaper /** * Unescapes a single quoted string. * - * @param string $value A single quoted string. + * @param string $value A single quoted string * - * @return string The unescaped string. + * @return string The unescaped string */ public function unescapeSingleQuotedString($value) { @@ -51,9 +51,9 @@ public function unescapeSingleQuotedString($value) /** * Unescapes a double quoted string. * - * @param string $value A double quoted string. + * @param string $value A double quoted string * - * @return string The unescaped string. + * @return string The unescaped string */ public function unescapeDoubleQuotedString($value) { diff --git a/vendor/symfony/yaml/Yaml.php b/vendor/symfony/yaml/Yaml.php index be05a365..6fc4e927 100644 --- a/vendor/symfony/yaml/Yaml.php +++ b/vendor/symfony/yaml/Yaml.php @@ -73,24 +73,28 @@ public static function parse($input, $exceptionOnInvalidType = false, $objectSup } /** - * Dumps a PHP array to a YAML string. + * Dumps a PHP value to a YAML string. * * The dump method, when supplied with an array, will do its best * to convert the array into friendly YAML. * - * @param array $array PHP array + * @param mixed $input The PHP value * @param int $inline The level where you switch to inline YAML - * @param int $indent The amount of spaces to use for indentation of nested nodes. + * @param int $indent The amount of spaces to use for indentation of nested nodes * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise * @param bool $objectSupport true if object support is enabled, false otherwise * - * @return string A YAML string representing the original PHP array + * @return string A YAML string representing the original PHP value */ - public static function dump($array, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false) + public static function dump($input, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false) { + if ($indent < 1) { + throw new \InvalidArgumentException('The indentation must be greater than zero.'); + } + $yaml = new Dumper(); $yaml->setIndentation($indent); - return $yaml->dump($array, $inline, 0, $exceptionOnInvalidType, $objectSupport); + return $yaml->dump($input, $inline, 0, $exceptionOnInvalidType, $objectSupport); } } diff --git a/vendor/webmozart/assert/.composer-auth.json b/vendor/webmozart/assert/.composer-auth.json new file mode 100644 index 00000000..eea80018 --- /dev/null +++ b/vendor/webmozart/assert/.composer-auth.json @@ -0,0 +1,7 @@ +{ + "github-oauth": { + "github.com": "PLEASE DO NOT USE THIS TOKEN IN YOUR OWN PROJECTS/FORKS", + "github.com": "This token is reserved for testing the webmozart/* repositories", + "github.com": "a9debbffdd953ee9b3b82dbc3b807cde2086bb86" + } +} diff --git a/vendor/webmozart/assert/.gitignore b/vendor/webmozart/assert/.gitignore new file mode 100644 index 00000000..3a9875b4 --- /dev/null +++ b/vendor/webmozart/assert/.gitignore @@ -0,0 +1,2 @@ +/vendor/ +composer.lock diff --git a/vendor/webmozart/assert/.styleci.yml b/vendor/webmozart/assert/.styleci.yml new file mode 100644 index 00000000..bb3a52d8 --- /dev/null +++ b/vendor/webmozart/assert/.styleci.yml @@ -0,0 +1,7 @@ +preset: symfony + +enabled: + - ordered_use + +disabled: + - empty_return diff --git a/vendor/webmozart/assert/.travis.yml b/vendor/webmozart/assert/.travis.yml new file mode 100644 index 00000000..bb2c1317 --- /dev/null +++ b/vendor/webmozart/assert/.travis.yml @@ -0,0 +1,35 @@ +language: php + +sudo: false + +cache: + directories: + - $HOME/.composer/cache/files + +matrix: + include: + - php: 5.3 + - php: 5.4 + - php: 5.5 + - php: 5.6 + - php: hhvm + - php: nightly + - php: 7.0 + env: COVERAGE=yes + - php: 7.0 + env: COMPOSER_FLAGS='--prefer-lowest --prefer-stable' + allow_failures: + - php: hhvm + - php: nightly + fast_finish: true + +before_install: + - if [[ $TRAVIS_PHP_VERSION != hhvm && $COVERAGE != yes ]]; then phpenv config-rm xdebug.ini; fi; + - if [[ $TRAVIS_REPO_SLUG = webmozart/assert ]]; then cp .composer-auth.json ~/.composer/auth.json; fi; + - composer self-update + +install: composer update $COMPOSER_FLAGS --prefer-dist --no-interaction + +script: if [[ $COVERAGE = yes ]]; then vendor/bin/phpunit --verbose --coverage-clover=coverage.clover; else vendor/bin/phpunit --verbose; fi + +after_script: if [[ $COVERAGE = yes ]]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md new file mode 100644 index 00000000..16e01119 --- /dev/null +++ b/vendor/webmozart/assert/CHANGELOG.md @@ -0,0 +1,28 @@ +Changelog +========= + +* 1.1.0 (2016-08-09) + + * added `Assert::object()` + * added `Assert::propertyExists()` + * added `Assert::propertyNotExists()` + * added `Assert::methodExists()` + * added `Assert::methodNotExists()` + * added `Assert::uuid()` + +* 1.0.2 (2015-08-24) + + * integrated Style CI + * add tests for minimum package dependencies on Travis CI + +* 1.0.1 (2015-05-12) + + * added support for PHP 5.3.3 + +* 1.0.0 (2015-05-12) + + * first stable release + +* 1.0.0-beta (2015-03-19) + + * first beta release diff --git a/vendor/webmozart/assert/LICENSE b/vendor/webmozart/assert/LICENSE new file mode 100644 index 00000000..9e2e3075 --- /dev/null +++ b/vendor/webmozart/assert/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Bernhard Schussek + +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/webmozart/assert/README.md b/vendor/webmozart/assert/README.md new file mode 100644 index 00000000..f72fdc4c --- /dev/null +++ b/vendor/webmozart/assert/README.md @@ -0,0 +1,235 @@ +Webmozart Assert +================ + +[![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=1.1.0)](https://travis-ci.org/webmozart/assert) +[![Build status](https://ci.appveyor.com/api/projects/status/lyg83bcsisrr94se/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/assert/branch/master) +[![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert) +[![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert) +[![Dependency Status](https://www.versioneye.com/php/webmozart:assert/1.1.0/badge.svg)](https://www.versioneye.com/php/webmozart:assert/1.1.0) + +Latest release: [1.1.0](https://packagist.org/packages/webmozart/assert#1.1.0) + +PHP >= 5.3.9 + +This library contains efficient assertions to test the input and output of +your methods. With these assertions, you can greatly reduce the amount of coding +needed to write a safe implementation. + +All assertions in the [`Assert`] class throw an `\InvalidArgumentException` if +they fail. + +FAQ +--- + +**What's the difference to [beberlei/assert]?** + +This library is heavily inspired by Benjamin Eberlei's wonderful [assert package], +but fixes a usability issue with error messages that can't be fixed there without +breaking backwards compatibility. + +This package features usable error messages by default. However, you can also +easily write custom error messages: + +``` +Assert::string($path, 'The path is expected to be a string. Got: %s'); +``` + +In [beberlei/assert], the ordering of the `%s` placeholders is different for +every assertion. This package, on the contrary, provides consistent placeholder +ordering for all assertions: + +* `%s`: The tested value as string, e.g. `"/foo/bar"`. +* `%2$s`, `%3$s`, ...: Additional assertion-specific values, e.g. the + minimum/maximum length, allowed values, etc. + +Check the source code of the assertions to find out details about the additional +available placeholders. + +Installation +------------ + +Use [Composer] to install the package: + +``` +$ composer require webmozart/assert +``` + +Example +------- + +```php +use Webmozart\Assert\Assert; + +class Employee +{ + public function __construct($id) + { + Assert::integer($id, 'The employee ID must be an integer. Got: %s'); + Assert::greaterThan($id, 0, 'The employee ID must be a positive integer. Got: %s'); + } +} +``` + +If you create an employee with an invalid ID, an exception is thrown: + +```php +new Employee('foobar'); +// => InvalidArgumentException: +// The employee ID must be an integer. Got: string + +new Employee(-10); +// => InvalidArgumentException: +// The employee ID must be a positive integer. Got: -10 +``` + +Assertions +---------- + +The [`Assert`] class provides the following assertions: + +### Type Assertions + +Method | Description +----------------------------------------------- | -------------------------------------------------- +`string($value, $message = '')` | Check that a value is a string +`stringNotEmpty($value, $message = '')` | Check that a value is a non-empty string +`integer($value, $message = '')` | Check that a value is an integer +`integerish($value, $message = '')` | Check that a value casts to an integer +`float($value, $message = '')` | Check that a value is a float +`numeric($value, $message = '')` | Check that a value is numeric +`boolean($value, $message = '')` | Check that a value is a boolean +`scalar($value, $message = '')` | Check that a value is a scalar +`object($value, $message = '')` | Check that a value is an object +`resource($value, $type = null, $message = '')` | Check that a value is a resource +`isCallable($value, $message = '')` | Check that a value is a callable +`isArray($value, $message = '')` | Check that a value is an array +`isTraversable($value, $message = '')` | Check that a value is an array or a `\Traversable` +`isInstanceOf($value, $class, $message = '')` | Check that a value is an `instanceof` a class +`notInstanceOf($value, $class, $message = '')` | Check that a value is not an `instanceof` a class + +### Comparison Assertions + +Method | Description +----------------------------------------------- | -------------------------------------------------- +`true($value, $message = '')` | Check that a value is `true` +`false($value, $message = '')` | Check that a value is `false` +`null($value, $message = '')` | Check that a value is `null` +`notNull($value, $message = '')` | Check that a value is not `null` +`isEmpty($value, $message = '')` | Check that a value is `empty()` +`notEmpty($value, $message = '')` | Check that a value is not `empty()` +`eq($value, $value2, $message = '')` | Check that a value equals another (`==`) +`notEq($value, $value2, $message = '')` | Check that a value does not equal another (`!=`) +`same($value, $value2, $message = '')` | Check that a value is identical to another (`===`) +`notSame($value, $value2, $message = '')` | Check that a value is not identical to another (`!==`) +`greaterThan($value, $value2, $message = '')` | Check that a value is greater than another +`greaterThanEq($value, $value2, $message = '')` | Check that a value is greater than or equal to another +`lessThan($value, $value2, $message = '')` | Check that a value is less than another +`lessThanEq($value, $value2, $message = '')` | Check that a value is less than or equal to another +`range($value, $min, $max, $message = '')` | Check that a value is within a range +`oneOf($value, array $values, $message = '')` | Check that a value is one of a list of values + +### String Assertions + +You should check that a value is a string with `Assert::string()` before making +any of the following assertions. + +Method | Description +--------------------------------------------------- | -------------------------------------------------- +`contains($value, $subString, $message = '')` | Check that a string contains a substring +`startsWith($value, $prefix, $message = '')` | Check that a string has a prefix +`startsWithLetter($value, $message = '')` | Check that a string starts with a letter +`endsWith($value, $suffix, $message = '')` | Check that a string has a suffix +`regex($value, $pattern, $message = '')` | Check that a string matches a regular expression +`alpha($value, $message = '')` | Check that a string contains letters only +`digits($value, $message = '')` | Check that a string contains digits only +`alnum($value, $message = '')` | Check that a string contains letters and digits only +`lower($value, $message = '')` | Check that a string contains lowercase characters only +`upper($value, $message = '')` | Check that a string contains uppercase characters only +`length($value, $length, $message = '')` | Check that a string has a certain number of characters +`minLength($value, $min, $message = '')` | Check that a string has at least a certain number of characters +`maxLength($value, $max, $message = '')` | Check that a string has at most a certain number of characters +`lengthBetween($value, $min, $max, $message = '')` | Check that a string has a length in the given range +`uuid($value, $message = '')` | Check that a string is a valid UUID + +### File Assertions + +Method | Description +----------------------------------- | -------------------------------------------------- +`fileExists($value, $message = '')` | Check that a value is an existing path +`file($value, $message = '')` | Check that a value is an existing file +`directory($value, $message = '')` | Check that a value is an existing directory +`readable($value, $message = '')` | Check that a value is a readable path +`writable($value, $message = '')` | Check that a value is a writable path + +### Object Assertions + +Method | Description +----------------------------------------------------- | -------------------------------------------------- +`classExists($value, $message = '')` | Check that a value is an existing class name +`subclassOf($value, $class, $message = '')` | Check that a class is a subclass of another +`implementsInterface($value, $class, $message = '')` | Check that a class implements an interface +`propertyExists($value, $property, $message = '')` | Check that a property exists in a class/object +`propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object +`methodExists($value, $method, $message = '')` | Check that a method exists in a class/object +`methodNotExists($value, $method, $message = '')` | Check that a method does not exist in a class/object + +### Array Assertions + +Method | Description +------------------------------------------- | -------------------------------------------------- +`keyExists($array, $key, $message = '')` | Check that a key exists in an array +`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array + +### Collection Assertions + +All of the above assertions can be prefixed with `all*()` to test the contents +of an array or a `\Traversable`: + +```php +Assert::allIsInstanceOf('Acme\Employee', $employees); +``` + +### Nullable Assertions + +All of the above assertions can be prefixed with `nullOr*()` to run the +assertion only if it the value is not `null`: + +```php +Assert::nullOrString($middleName, 'The middle name must be a string or null. Got: %s'); +``` + +Authors +------- + +* [Bernhard Schussek] a.k.a. [@webmozart] +* [The Community Contributors] + +Contribute +---------- + +Contributions to the package are always welcome! + +* Report any bugs or issues you find on the [issue tracker]. +* You can grab the source code at the package's [Git repository]. + +Support +------- + +If you are having problems, send a mail to bschussek@gmail.com or shout out to +[@webmozart] on Twitter. + +License +------- + +All contents of this package are licensed under the [MIT license]. + +[beberlei/assert]: https://github.com/beberlei/assert +[assert package]: https://github.com/beberlei/assert +[Composer]: https://getcomposer.org +[Bernhard Schussek]: http://webmozarts.com +[The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors +[issue tracker]: https://github.com/webmozart/assert +[Git repository]: https://github.com/webmozart/assert +[@webmozart]: https://twitter.com/webmozart +[MIT license]: LICENSE +[`Assert`]: src/Assert.php diff --git a/vendor/webmozart/assert/appveyor.yml b/vendor/webmozart/assert/appveyor.yml new file mode 100644 index 00000000..72e614de --- /dev/null +++ b/vendor/webmozart/assert/appveyor.yml @@ -0,0 +1,36 @@ +build: false +platform: x86 +clone_folder: c:\projects\webmozart\assert + +cache: + - c:\php -> appveyor.yml + +init: + - SET PATH=c:\php;%PATH% + - SET COMPOSER_NO_INTERACTION=1 + - SET PHP=1 + +install: + - IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php) + - cd c:\php + - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.0.0-nts-Win32-VC14-x86.zip + - IF %PHP%==1 7z x php-7.0.0-nts-Win32-VC14-x86.zip -y >nul + - IF %PHP%==1 del /Q *.zip + - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat + - IF %PHP%==1 copy /Y php.ini-development php.ini + - IF %PHP%==1 echo max_execution_time=1200 >> php.ini + - IF %PHP%==1 echo date.timezone="UTC" >> php.ini + - IF %PHP%==1 echo extension_dir=ext >> php.ini + - IF %PHP%==1 echo extension=php_curl.dll >> php.ini + - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini + - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini + - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini + - appveyor DownloadFile https://getcomposer.org/composer.phar + - cd c:\projects\webmozart\assert + - mkdir %APPDATA%\Composer + - IF %APPVEYOR_REPO_NAME%==webmozart/assert copy /Y .composer-auth.json %APPDATA%\Composer\auth.json + - composer update --prefer-dist --no-progress --ansi + +test_script: + - cd c:\projects\webmozart\assert + - vendor\bin\phpunit.bat --verbose diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json new file mode 100644 index 00000000..836ac72b --- /dev/null +++ b/vendor/webmozart/assert/composer.json @@ -0,0 +1,34 @@ +{ + "name": "webmozart/assert", + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": ["assert", "check", "validate"], + "license": "MIT", + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "require": { + "php": "^5.3.3|^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.6", + "sebastian/version": "^1.0.1" + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "Webmozart\\Assert\\Tests\\": "tests/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + } +} diff --git a/vendor/webmozart/assert/phpunit.xml.dist b/vendor/webmozart/assert/phpunit.xml.dist new file mode 100644 index 00000000..db20e9b4 --- /dev/null +++ b/vendor/webmozart/assert/phpunit.xml.dist @@ -0,0 +1,16 @@ + + + + + + ./tests/ + + + + + + + ./src/ + + + diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php new file mode 100644 index 00000000..a5f09bba --- /dev/null +++ b/vendor/webmozart/assert/src/Assert.php @@ -0,0 +1,903 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\Assert; + +use BadMethodCallException; +use InvalidArgumentException; +use Traversable; + +/** + * Efficient assertions to validate the input/output of your methods. + * + * @method static void nullOrString($value, $message = '') + * @method static void nullOrStringNotEmpty($value, $message = '') + * @method static void nullOrInteger($value, $message = '') + * @method static void nullOrIntegerish($value, $message = '') + * @method static void nullOrFloat($value, $message = '') + * @method static void nullOrNumeric($value, $message = '') + * @method static void nullOrBoolean($value, $message = '') + * @method static void nullOrScalar($value, $message = '') + * @method static void nullOrObject($value, $message = '') + * @method static void nullOrResource($value, $type = null, $message = '') + * @method static void nullOrIsCallable($value, $message = '') + * @method static void nullOrIsArray($value, $message = '') + * @method static void nullOrIsTraversable($value, $message = '') + * @method static void nullOrIsInstanceOf($value, $class, $message = '') + * @method static void nullOrNotInstanceOf($value, $class, $message = '') + * @method static void nullOrIsEmpty($value, $message = '') + * @method static void nullOrNotEmpty($value, $message = '') + * @method static void nullOrTrue($value, $message = '') + * @method static void nullOrFalse($value, $message = '') + * @method static void nullOrEq($value, $value2, $message = '') + * @method static void nullOrNotEq($value,$value2, $message = '') + * @method static void nullOrSame($value, $value2, $message = '') + * @method static void nullOrNotSame($value, $value2, $message = '') + * @method static void nullOrGreaterThan($value, $value2, $message = '') + * @method static void nullOrGreaterThanEq($value, $value2, $message = '') + * @method static void nullOrLessThan($value, $value2, $message = '') + * @method static void nullOrLessThanEq($value, $value2, $message = '') + * @method static void nullOrRange($value, $min, $max, $message = '') + * @method static void nullOrOneOf($value, $values, $message = '') + * @method static void nullOrContains($value, $subString, $message = '') + * @method static void nullOrStartsWith($value, $prefix, $message = '') + * @method static void nullOrStartsWithLetter($value, $message = '') + * @method static void nullOrEndsWith($value, $suffix, $message = '') + * @method static void nullOrRegex($value, $pattern, $message = '') + * @method static void nullOrAlpha($value, $message = '') + * @method static void nullOrDigits($value, $message = '') + * @method static void nullOrAlnum($value, $message = '') + * @method static void nullOrLower($value, $message = '') + * @method static void nullOrUpper($value, $message = '') + * @method static void nullOrLength($value, $length, $message = '') + * @method static void nullOrMinLength($value, $min, $message = '') + * @method static void nullOrMaxLength($value, $max, $message = '') + * @method static void nullOrLengthBetween($value, $min, $max, $message = '') + * @method static void nullOrFileExists($value, $message = '') + * @method static void nullOrFile($value, $message = '') + * @method static void nullOrDirectory($value, $message = '') + * @method static void nullOrReadable($value, $message = '') + * @method static void nullOrWritable($value, $message = '') + * @method static void nullOrClassExists($value, $message = '') + * @method static void nullOrSubclassOf($value, $class, $message = '') + * @method static void nullOrImplementsInterface($value, $interface, $message = '') + * @method static void nullOrPropertyExists($value, $property, $message = '') + * @method static void nullOrPropertyNotExists($value, $property, $message = '') + * @method static void nullOrMethodExists($value, $method, $message = '') + * @method static void nullOrMethodNotExists($value, $method, $message = '') + * @method static void nullOrKeyExists($value, $key, $message = '') + * @method static void nullOrKeyNotExists($value, $key, $message = '') + * @method static void nullOrUuid($values, $message = '') + * @method static void allString($values, $message = '') + * @method static void allStringNotEmpty($values, $message = '') + * @method static void allInteger($values, $message = '') + * @method static void allIntegerish($values, $message = '') + * @method static void allFloat($values, $message = '') + * @method static void allNumeric($values, $message = '') + * @method static void allBoolean($values, $message = '') + * @method static void allScalar($values, $message = '') + * @method static void allObject($values, $message = '') + * @method static void allResource($values, $type = null, $message = '') + * @method static void allIsCallable($values, $message = '') + * @method static void allIsArray($values, $message = '') + * @method static void allIsTraversable($values, $message = '') + * @method static void allIsInstanceOf($values, $class, $message = '') + * @method static void allNotInstanceOf($values, $class, $message = '') + * @method static void allNull($values, $message = '') + * @method static void allNotNull($values, $message = '') + * @method static void allIsEmpty($values, $message = '') + * @method static void allNotEmpty($values, $message = '') + * @method static void allTrue($values, $message = '') + * @method static void allFalse($values, $message = '') + * @method static void allEq($values, $value2, $message = '') + * @method static void allNotEq($values,$value2, $message = '') + * @method static void allSame($values, $value2, $message = '') + * @method static void allNotSame($values, $value2, $message = '') + * @method static void allGreaterThan($values, $value2, $message = '') + * @method static void allGreaterThanEq($values, $value2, $message = '') + * @method static void allLessThan($values, $value2, $message = '') + * @method static void allLessThanEq($values, $value2, $message = '') + * @method static void allRange($values, $min, $max, $message = '') + * @method static void allOneOf($values, $values, $message = '') + * @method static void allContains($values, $subString, $message = '') + * @method static void allStartsWith($values, $prefix, $message = '') + * @method static void allStartsWithLetter($values, $message = '') + * @method static void allEndsWith($values, $suffix, $message = '') + * @method static void allRegex($values, $pattern, $message = '') + * @method static void allAlpha($values, $message = '') + * @method static void allDigits($values, $message = '') + * @method static void allAlnum($values, $message = '') + * @method static void allLower($values, $message = '') + * @method static void allUpper($values, $message = '') + * @method static void allLength($values, $length, $message = '') + * @method static void allMinLength($values, $min, $message = '') + * @method static void allMaxLength($values, $max, $message = '') + * @method static void allLengthBetween($values, $min, $max, $message = '') + * @method static void allFileExists($values, $message = '') + * @method static void allFile($values, $message = '') + * @method static void allDirectory($values, $message = '') + * @method static void allReadable($values, $message = '') + * @method static void allWritable($values, $message = '') + * @method static void allClassExists($values, $message = '') + * @method static void allSubclassOf($values, $class, $message = '') + * @method static void allImplementsInterface($values, $interface, $message = '') + * @method static void allPropertyExists($values, $property, $message = '') + * @method static void allPropertyNotExists($values, $property, $message = '') + * @method static void allMethodExists($values, $method, $message = '') + * @method static void allMethodNotExists($values, $method, $message = '') + * @method static void allKeyExists($values, $key, $message = '') + * @method static void allKeyNotExists($values, $key, $message = '') + * @method static void allUuid($values, $message = '') + * + * @since 1.0 + * + * @author Bernhard Schussek + */ +class Assert +{ + public static function string($value, $message = '') + { + if (!is_string($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a string. Got: %s', + self::typeToString($value) + )); + } + } + + public static function stringNotEmpty($value, $message = '') + { + self::string($value, $message); + self::notEmpty($value, $message); + } + + public static function integer($value, $message = '') + { + if (!is_int($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an integer. Got: %s', + self::typeToString($value) + )); + } + } + + public static function integerish($value, $message = '') + { + if (!is_numeric($value) || $value != (int) $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an integerish value. Got: %s', + self::typeToString($value) + )); + } + } + + public static function float($value, $message = '') + { + if (!is_float($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a float. Got: %s', + self::typeToString($value) + )); + } + } + + public static function numeric($value, $message = '') + { + if (!is_numeric($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a numeric. Got: %s', + self::typeToString($value) + )); + } + } + + public static function boolean($value, $message = '') + { + if (!is_bool($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a boolean. Got: %s', + self::typeToString($value) + )); + } + } + + public static function scalar($value, $message = '') + { + if (!is_scalar($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a scalar. Got: %s', + self::typeToString($value) + )); + } + } + + public static function object($value, $message = '') + { + if (!is_object($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an object. Got: %s', + self::typeToString($value) + )); + } + } + + public static function resource($value, $type = null, $message = '') + { + if (!is_resource($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a resource. Got: %s', + self::typeToString($value) + )); + } + + if ($type && $type !== get_resource_type($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a resource of type %2$s. Got: %s', + self::typeToString($value), + $type + )); + } + } + + public static function isCallable($value, $message = '') + { + if (!is_callable($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a callable. Got: %s', + self::typeToString($value) + )); + } + } + + public static function isArray($value, $message = '') + { + if (!is_array($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an array. Got: %s', + self::typeToString($value) + )); + } + } + + public static function isTraversable($value, $message = '') + { + if (!is_array($value) && !($value instanceof Traversable)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a traversable. Got: %s', + self::typeToString($value) + )); + } + } + + public static function isInstanceOf($value, $class, $message = '') + { + if (!($value instanceof $class)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an instance of %2$s. Got: %s', + self::typeToString($value), + $class + )); + } + } + + public static function notInstanceOf($value, $class, $message = '') + { + if ($value instanceof $class) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an instance other than %2$s. Got: %s', + self::typeToString($value), + $class + )); + } + } + + public static function isEmpty($value, $message = '') + { + if (!empty($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an empty value. Got: %s', + self::valueToString($value) + )); + } + } + + public static function notEmpty($value, $message = '') + { + if (empty($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a non-empty value. Got: %s', + self::valueToString($value) + )); + } + } + + public static function null($value, $message = '') + { + if (null !== $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected null. Got: %s', + self::valueToString($value) + )); + } + } + + public static function notNull($value, $message = '') + { + if (null === $value) { + throw new InvalidArgumentException( + $message ?: 'Expected a value other than null.' + ); + } + } + + public static function true($value, $message = '') + { + if (true !== $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to be true. Got: %s', + self::valueToString($value) + )); + } + } + + public static function false($value, $message = '') + { + if (false !== $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to be false. Got: %s', + self::valueToString($value) + )); + } + } + + public static function eq($value, $value2, $message = '') + { + if ($value2 != $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value equal to %2$s. Got: %s', + self::valueToString($value), + self::valueToString($value2) + )); + } + } + + public static function notEq($value, $value2, $message = '') + { + if ($value2 == $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a different value than %s.', + self::valueToString($value2) + )); + } + } + + public static function same($value, $value2, $message = '') + { + if ($value2 !== $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value identical to %2$s. Got: %s', + self::valueToString($value), + self::valueToString($value2) + )); + } + } + + public static function notSame($value, $value2, $message = '') + { + if ($value2 === $value) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value not identical to %s.', + self::valueToString($value2) + )); + } + } + + public static function greaterThan($value, $limit, $message = '') + { + if ($value <= $limit) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value greater than %2$s. Got: %s', + self::valueToString($value), + self::valueToString($limit) + )); + } + } + + public static function greaterThanEq($value, $limit, $message = '') + { + if ($value < $limit) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value greater than or equal to %2$s. Got: %s', + self::valueToString($value), + self::valueToString($limit) + )); + } + } + + public static function lessThan($value, $limit, $message = '') + { + if ($value >= $limit) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value less than %2$s. Got: %s', + self::valueToString($value), + self::valueToString($limit) + )); + } + } + + public static function lessThanEq($value, $limit, $message = '') + { + if ($value > $limit) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value less than or equal to %2$s. Got: %s', + self::valueToString($value), + self::valueToString($limit) + )); + } + } + + public static function range($value, $min, $max, $message = '') + { + if ($value < $min || $value > $max) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value between %2$s and %3$s. Got: %s', + self::valueToString($value), + self::valueToString($min), + self::valueToString($max) + )); + } + } + + public static function oneOf($value, array $values, $message = '') + { + if (!in_array($value, $values, true)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected one of: %2$s. Got: %s', + self::valueToString($value), + implode(', ', array_map(array(__CLASS__, 'valueToString'), $values)) + )); + } + } + + public static function contains($value, $subString, $message = '') + { + if (false === strpos($value, $subString)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain %2$s. Got: %s', + self::valueToString($value), + self::valueToString($subString) + )); + } + } + + public static function startsWith($value, $prefix, $message = '') + { + if (0 !== strpos($value, $prefix)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to start with %2$s. Got: %s', + self::valueToString($value), + self::valueToString($prefix) + )); + } + } + + public static function startsWithLetter($value, $message = '') + { + $valid = isset($value[0]); + + if ($valid) { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'C'); + $valid = ctype_alpha($value[0]); + setlocale(LC_CTYPE, $locale); + } + + if (!$valid) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to start with a letter. Got: %s', + self::valueToString($value) + )); + } + } + + public static function endsWith($value, $suffix, $message = '') + { + if ($suffix !== substr($value, -self::strlen($suffix))) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to end with %2$s. Got: %s', + self::valueToString($value), + self::valueToString($suffix) + )); + } + } + + public static function regex($value, $pattern, $message = '') + { + if (!preg_match($pattern, $value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'The value %s does not match the expected pattern.', + self::valueToString($value) + )); + } + } + + public static function alpha($value, $message = '') + { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'C'); + $valid = !ctype_alpha($value); + setlocale(LC_CTYPE, $locale); + + if ($valid) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain only letters. Got: %s', + self::valueToString($value) + )); + } + } + + public static function digits($value, $message = '') + { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'C'); + $valid = !ctype_digit($value); + setlocale(LC_CTYPE, $locale); + + if ($valid) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain digits only. Got: %s', + self::valueToString($value) + )); + } + } + + public static function alnum($value, $message = '') + { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'C'); + $valid = !ctype_alnum($value); + setlocale(LC_CTYPE, $locale); + + if ($valid) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain letters and digits only. Got: %s', + self::valueToString($value) + )); + } + } + + public static function lower($value, $message = '') + { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'C'); + $valid = !ctype_lower($value); + setlocale(LC_CTYPE, $locale); + + if ($valid) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain lowercase characters only. Got: %s', + self::valueToString($value) + )); + } + } + + public static function upper($value, $message = '') + { + $locale = setlocale(LC_CTYPE, 0); + setlocale(LC_CTYPE, 'C'); + $valid = !ctype_upper($value); + setlocale(LC_CTYPE, $locale); + + if ($valid) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain uppercase characters only. Got: %s', + self::valueToString($value) + )); + } + } + + public static function length($value, $length, $message = '') + { + if ($length !== self::strlen($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain %2$s characters. Got: %s', + self::valueToString($value), + $length + )); + } + } + + public static function minLength($value, $min, $message = '') + { + if (self::strlen($value) < $min) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain at least %2$s characters. Got: %s', + self::valueToString($value), + $min + )); + } + } + + public static function maxLength($value, $max, $message = '') + { + if (self::strlen($value) > $max) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain at most %2$s characters. Got: %s', + self::valueToString($value), + $max + )); + } + } + + public static function lengthBetween($value, $min, $max, $message = '') + { + $length = self::strlen($value); + + if ($length < $min || $length > $max) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s', + self::valueToString($value), + $min, + $max + )); + } + } + + public static function fileExists($value, $message = '') + { + self::string($value); + + if (!file_exists($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'The file %s does not exist.', + self::valueToString($value) + )); + } + } + + public static function file($value, $message = '') + { + self::fileExists($value, $message); + + if (!is_file($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'The path %s is not a file.', + self::valueToString($value) + )); + } + } + + public static function directory($value, $message = '') + { + self::fileExists($value, $message); + + if (!is_dir($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'The path %s is no directory.', + self::valueToString($value) + )); + } + } + + public static function readable($value, $message = '') + { + if (!is_readable($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'The path %s is not readable.', + self::valueToString($value) + )); + } + } + + public static function writable($value, $message = '') + { + if (!is_writable($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'The path %s is not writable.', + self::valueToString($value) + )); + } + } + + public static function classExists($value, $message = '') + { + if (!class_exists($value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an existing class name. Got: %s', + self::valueToString($value) + )); + } + } + + public static function subclassOf($value, $class, $message = '') + { + if (!is_subclass_of($value, $class)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected a sub-class of %2$s. Got: %s', + self::valueToString($value), + self::valueToString($class) + )); + } + } + + public static function implementsInterface($value, $interface, $message = '') + { + if (!in_array($interface, class_implements($value))) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected an implementation of %2$s. Got: %s', + self::valueToString($value), + self::valueToString($interface) + )); + } + } + + public static function propertyExists($classOrObject, $property, $message = '') + { + if (!property_exists($classOrObject, $property)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected the property %s to exist.', + self::valueToString($property) + )); + } + } + + public static function propertyNotExists($classOrObject, $property, $message = '') + { + if (property_exists($classOrObject, $property)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected the property %s to not exist.', + self::valueToString($property) + )); + } + } + + public static function methodExists($classOrObject, $method, $message = '') + { + if (!method_exists($classOrObject, $method)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected the method %s to exist.', + self::valueToString($method) + )); + } + } + + public static function methodNotExists($classOrObject, $method, $message = '') + { + if (method_exists($classOrObject, $method)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected the method %s to not exist.', + self::valueToString($method) + )); + } + } + + public static function keyExists($array, $key, $message = '') + { + if (!array_key_exists($key, $array)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected the key %s to exist.', + self::valueToString($key) + )); + } + } + + public static function keyNotExists($array, $key, $message = '') + { + if (array_key_exists($key, $array)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Expected the key %s to not exist.', + self::valueToString($key) + )); + } + } + + public static function uuid($value, $message = '') + { + $value = str_replace(array('urn:', 'uuid:', '{', '}'), '', $value); + + // The nil UUID is special form of UUID that is specified to have all + // 128 bits set to zero. + if ('00000000-0000-0000-0000-000000000000' === $value) { + return; + } + + if (!preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) { + throw new InvalidArgumentException(sprintf( + $message ?: 'Value "%s" is not a valid UUID.', + self::valueToString($value) + )); + } + } + + public static function __callStatic($name, $arguments) + { + if ('nullOr' === substr($name, 0, 6)) { + if (null !== $arguments[0]) { + $method = lcfirst(substr($name, 6)); + call_user_func_array(array('static', $method), $arguments); + } + + return; + } + + if ('all' === substr($name, 0, 3)) { + self::isTraversable($arguments[0]); + + $method = lcfirst(substr($name, 3)); + $args = $arguments; + + foreach ($arguments[0] as $entry) { + $args[0] = $entry; + + call_user_func_array(array('static', $method), $args); + } + + return; + } + + throw new BadMethodCallException('No such method: '.$name); + } + + protected static function valueToString($value) + { + if (null === $value) { + return 'null'; + } + + if (true === $value) { + return 'true'; + } + + if (false === $value) { + return 'false'; + } + + if (is_array($value)) { + return 'array'; + } + + if (is_object($value)) { + return get_class($value); + } + + if (is_resource($value)) { + return 'resource'; + } + + if (is_string($value)) { + return '"'.$value.'"'; + } + + return (string) $value; + } + + protected static function typeToString($value) + { + return is_object($value) ? get_class($value) : gettype($value); + } + + protected static function strlen($value) + { + if (!function_exists('mb_detect_encoding')) { + return strlen($value); + } + + if (false === $encoding = mb_detect_encoding($value)) { + return strlen($value); + } + + return mb_strwidth($value, $encoding); + } + + private function __construct() + { + } +} diff --git a/vendor/webmozart/assert/tests/AssertTest.php b/vendor/webmozart/assert/tests/AssertTest.php new file mode 100644 index 00000000..2a26497e --- /dev/null +++ b/vendor/webmozart/assert/tests/AssertTest.php @@ -0,0 +1,422 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Webmozart\Assert\Tests; + +use ArrayIterator; +use Exception; +use PHPUnit_Framework_TestCase; +use RuntimeException; +use stdClass; +use Webmozart\Assert\Assert; + +/** + * @since 1.0 + * + * @author Bernhard Schussek + */ +class AssertTest extends PHPUnit_Framework_TestCase +{ + private static $resource; + + public static function getResource() + { + if (!static::$resource) { + static::$resource = fopen(__FILE__, 'r'); + } + + return static::$resource; + } + + public static function tearDownAfterClass() + { + @fclose(self::$resource); + } + + public function getTests() + { + $resource = self::getResource(); + + return array( + array('string', array('value'), true), + array('string', array(''), true), + array('string', array(1234), false), + array('stringNotEmpty', array('value'), true), + array('stringNotEmpty', array(''), false), + array('stringNotEmpty', array(1234), false), + array('integer', array(123), true), + array('integer', array('123'), false), + array('integer', array(1.0), false), + array('integer', array(1.23), false), + array('integerish', array(1.0), true), + array('integerish', array(1.23), false), + array('integerish', array(123), true), + array('integerish', array('123'), true), + array('float', array(1.0), true), + array('float', array(1.23), true), + array('float', array(123), false), + array('float', array('123'), false), + array('numeric', array(1.0), true), + array('numeric', array(1.23), true), + array('numeric', array(123), true), + array('numeric', array('123'), true), + array('numeric', array('foo'), false), + array('boolean', array(true), true), + array('boolean', array(false), true), + array('boolean', array(1), false), + array('boolean', array('1'), false), + array('scalar', array('1'), true), + array('scalar', array(123), true), + array('scalar', array(true), true), + array('scalar', array(null), false), + array('scalar', array(array()), false), + array('scalar', array(new stdClass()), false), + array('object', array(new stdClass()), true), + array('object', array(new RuntimeException()), true), + array('object', array(null), false), + array('object', array(true), false), + array('object', array(1), false), + array('object', array(array()), false), + array('resource', array($resource), true), + array('resource', array($resource, 'stream'), true), + array('resource', array($resource, 'other'), false), + array('resource', array(1), false), + array('isCallable', array('strlen'), true), + array('isCallable', array(array($this, 'getTests')), true), + array('isCallable', array(function () {}), true), + array('isCallable', array(1234), false), + array('isCallable', array('foobar'), false), + array('isArray', array(array()), true), + array('isArray', array(array(1, 2, 3)), true), + array('isArray', array(new ArrayIterator(array())), false), + array('isArray', array(123), false), + array('isArray', array(new stdClass()), false), + array('isTraversable', array(array()), true), + array('isTraversable', array(array(1, 2, 3)), true), + array('isTraversable', array(new ArrayIterator(array())), true), + array('isTraversable', array(123), false), + array('isTraversable', array(new stdClass()), false), + array('isInstanceOf', array(new stdClass(), 'stdClass'), true), + array('isInstanceOf', array(new Exception(), 'stdClass'), false), + array('isInstanceOf', array(123, 'stdClass'), false), + array('isInstanceOf', array(array(), 'stdClass'), false), + array('notInstanceOf', array(new stdClass(), 'stdClass'), false), + array('notInstanceOf', array(new Exception(), 'stdClass'), true), + array('notInstanceOf', array(123, 'stdClass'), true), + array('notInstanceOf', array(array(), 'stdClass'), true), + array('true', array(true), true), + array('true', array(false), false), + array('true', array(1), false), + array('true', array(null), false), + array('false', array(false), true), + array('false', array(true), false), + array('false', array(1), false), + array('false', array(0), false), + array('false', array(null), false), + array('null', array(null), true), + array('null', array(false), false), + array('null', array(0), false), + array('notNull', array(false), true), + array('notNull', array(0), true), + array('notNull', array(null), false), + array('isEmpty', array(null), true), + array('isEmpty', array(false), true), + array('isEmpty', array(0), true), + array('isEmpty', array(''), true), + array('isEmpty', array(1), false), + array('isEmpty', array('a'), false), + array('notEmpty', array(1), true), + array('notEmpty', array('a'), true), + array('notEmpty', array(null), false), + array('notEmpty', array(false), false), + array('notEmpty', array(0), false), + array('notEmpty', array(''), false), + array('eq', array(1, 1), true), + array('eq', array(1, '1'), true), + array('eq', array(1, true), true), + array('eq', array(1, 0), false), + array('notEq', array(1, 0), true), + array('notEq', array(1, 1), false), + array('notEq', array(1, '1'), false), + array('notEq', array(1, true), false), + array('same', array(1, 1), true), + array('same', array(1, '1'), false), + array('same', array(1, true), false), + array('same', array(1, 0), false), + array('notSame', array(1, 0), true), + array('notSame', array(1, 1), false), + array('notSame', array(1, '1'), true), + array('notSame', array(1, true), true), + array('greaterThan', array(1, 0), true), + array('greaterThan', array(0, 0), false), + array('greaterThanEq', array(2, 1), true), + array('greaterThanEq', array(1, 1), true), + array('greaterThanEq', array(0, 1), false), + array('lessThan', array(0, 1), true), + array('lessThan', array(1, 1), false), + array('lessThanEq', array(0, 1), true), + array('lessThanEq', array(1, 1), true), + array('lessThanEq', array(2, 1), false), + array('range', array(1, 1, 2), true), + array('range', array(2, 1, 2), true), + array('range', array(0, 1, 2), false), + array('range', array(3, 1, 2), false), + array('oneOf', array(1, array(1, 2, 3)), true), + array('oneOf', array(1, array('1', '2', '3')), false), + array('contains', array('abcd', 'ab'), true), + array('contains', array('abcd', 'bc'), true), + array('contains', array('abcd', 'cd'), true), + array('contains', array('abcd', 'de'), false), + array('contains', array('', 'de'), false), + array('startsWith', array('abcd', 'ab'), true), + array('startsWith', array('abcd', 'bc'), false), + array('startsWith', array('', 'bc'), false), + array('startsWithLetter', array('abcd'), true), + array('startsWithLetter', array('1abcd'), false), + array('startsWithLetter', array(''), false), + array('endsWith', array('abcd', 'cd'), true), + array('endsWith', array('abcd', 'bc'), false), + array('endsWith', array('', 'bc'), false), + array('regex', array('abcd', '~^ab~'), true), + array('regex', array('abcd', '~^bc~'), false), + array('regex', array('', '~^bc~'), false), + array('alpha', array('abcd'), true), + array('alpha', array('ab1cd'), false), + array('alpha', array(''), false), + array('digits', array('1234'), true), + array('digits', array('12a34'), false), + array('digits', array(''), false), + array('alnum', array('ab12'), true), + array('alnum', array('ab12$'), false), + array('alnum', array(''), false), + array('lower', array('abcd'), true), + array('lower', array('abCd'), false), + array('lower', array('ab_d'), false), + array('lower', array(''), false), + array('upper', array('ABCD'), true), + array('upper', array('ABcD'), false), + array('upper', array('AB_D'), false), + array('upper', array(''), false), + array('length', array('abcd', 4), true), + array('length', array('abc', 4), false), + array('length', array('abcde', 4), false), + array('length', array('Ƥbcd', 4), true, true), + array('length', array('Ƥbc', 4), false, true), + array('length', array('Ƥbcde', 4), false, true), + array('minLength', array('abcd', 4), true), + array('minLength', array('abcde', 4), true), + array('minLength', array('abc', 4), false), + array('minLength', array('Ƥbcd', 4), true, true), + array('minLength', array('Ƥbcde', 4), true, true), + array('minLength', array('Ƥbc', 4), false, true), + array('maxLength', array('abcd', 4), true), + array('maxLength', array('abc', 4), true), + array('maxLength', array('abcde', 4), false), + array('maxLength', array('Ƥbcd', 4), true, true), + array('maxLength', array('Ƥbc', 4), true, true), + array('maxLength', array('Ƥbcde', 4), false, true), + array('lengthBetween', array('abcd', 3, 5), true), + array('lengthBetween', array('abc', 3, 5), true), + array('lengthBetween', array('abcde', 3, 5), true), + array('lengthBetween', array('ab', 3, 5), false), + array('lengthBetween', array('abcdef', 3, 5), false), + array('lengthBetween', array('Ƥbcd', 3, 5), true, true), + array('lengthBetween', array('Ƥbc', 3, 5), true, true), + array('lengthBetween', array('Ƥbcde', 3, 5), true, true), + array('lengthBetween', array('Ƥb', 3, 5), false, true), + array('lengthBetween', array('Ƥbcdef', 3, 5), false, true), + array('fileExists', array(__FILE__), true), + array('fileExists', array(__DIR__), true), + array('fileExists', array(__DIR__.'/foobar'), false), + array('file', array(__FILE__), true), + array('file', array(__DIR__), false), + array('file', array(__DIR__.'/foobar'), false), + array('directory', array(__DIR__), true), + array('directory', array(__FILE__), false), + array('directory', array(__DIR__.'/foobar'), false), + // no tests for readable()/writable() for now + array('classExists', array(__CLASS__), true), + array('classExists', array(__NAMESPACE__.'\Foobar'), false), + array('subclassOf', array(__CLASS__, 'PHPUnit_Framework_TestCase'), true), + array('subclassOf', array(__CLASS__, 'stdClass'), false), + array('implementsInterface', array('ArrayIterator', 'Traversable'), true), + array('implementsInterface', array(__CLASS__, 'Traversable'), false), + array('propertyExists', array((object) array('property' => 0), 'property'), true), + array('propertyExists', array((object) array('property' => null), 'property'), true), + array('propertyExists', array((object) array('property' => null), 'foo'), false), + array('propertyNotExists', array((object) array('property' => 0), 'property'), false), + array('propertyNotExists', array((object) array('property' => null), 'property'), false), + array('propertyNotExists', array((object) array('property' => null), 'foo'), true), + array('methodExists', array('RuntimeException', 'getMessage'), true), + array('methodExists', array(new RuntimeException(), 'getMessage'), true), + array('methodExists', array('stdClass', 'getMessage'), false), + array('methodExists', array(new stdClass(), 'getMessage'), false), + array('methodExists', array(null, 'getMessage'), false), + array('methodExists', array(true, 'getMessage'), false), + array('methodExists', array(1, 'getMessage'), false), + array('methodNotExists', array('RuntimeException', 'getMessage'), false), + array('methodNotExists', array(new RuntimeException(), 'getMessage'), false), + array('methodNotExists', array('stdClass', 'getMessage'), true), + array('methodNotExists', array(new stdClass(), 'getMessage'), true), + array('methodNotExists', array(null, 'getMessage'), true), + array('methodNotExists', array(true, 'getMessage'), true), + array('methodNotExists', array(1, 'getMessage'), true), + array('keyExists', array(array('key' => 0), 'key'), true), + array('keyExists', array(array('key' => null), 'key'), true), + array('keyExists', array(array('key' => null), 'foo'), false), + array('keyNotExists', array(array('key' => 0), 'key'), false), + array('keyNotExists', array(array('key' => null), 'key'), false), + array('keyNotExists', array(array('key' => null), 'foo'), true), + array('uuid', array('00000000-0000-0000-0000-000000000000'), true), + array('uuid', array('ff6f8cb0-c57d-21e1-9b21-0800200c9a66'), true), + array('uuid', array('ff6f8cb0-c57d-11e1-9b21-0800200c9a66'), true), + array('uuid', array('ff6f8cb0-c57d-31e1-9b21-0800200c9a66'), true), + array('uuid', array('ff6f8cb0-c57d-41e1-9b21-0800200c9a66'), true), + array('uuid', array('ff6f8cb0-c57d-51e1-9b21-0800200c9a66'), true), + array('uuid', array('FF6F8CB0-C57D-11E1-9B21-0800200C9A66'), true), + array('uuid', array('zf6f8cb0-c57d-11e1-9b21-0800200c9a66'), false), + array('uuid', array('af6f8cb0c57d11e19b210800200c9a66'), false), + array('uuid', array('ff6f8cb0-c57da-51e1-9b21-0800200c9a66'), false), + array('uuid', array('af6f8cb-c57d-11e1-9b21-0800200c9a66'), false), + array('uuid', array('3f6f8cb0-c57d-11e1-9b21-0800200c9a6'), false), + + ); + } + + public function getMethods() + { + $methods = array(); + + foreach ($this->getTests() as $params) { + $methods[$params[0]] = array($params[0]); + } + + return array_values($methods); + } + + /** + * @dataProvider getTests + */ + public function testAssert($method, $args, $success, $multibyte = false) + { + if ($multibyte && !function_exists('mb_strlen')) { + $this->markTestSkipped('The fucntion mb_strlen() is not available'); + + return; + } + + if (!$success) { + $this->setExpectedException('\InvalidArgumentException'); + } + + call_user_func_array(array('Webmozart\Assert\Assert', $method), $args); + } + + /** + * @dataProvider getTests + */ + public function testNullOr($method, $args, $success, $multibyte = false) + { + if ($multibyte && !function_exists('mb_strlen')) { + $this->markTestSkipped('The fucntion mb_strlen() is not available'); + + return; + } + + if (!$success && null !== reset($args)) { + $this->setExpectedException('\InvalidArgumentException'); + } + + call_user_func_array(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), $args); + } + + /** + * @dataProvider getMethods + */ + public function testNullOrAcceptsNull($method) + { + call_user_func(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), null); + } + + /** + * @dataProvider getTests + */ + public function testAllArray($method, $args, $success, $multibyte = false) + { + if ($multibyte && !function_exists('mb_strlen')) { + $this->markTestSkipped('The fucntion mb_strlen() is not available'); + + return; + } + + if (!$success) { + $this->setExpectedException('\InvalidArgumentException'); + } + + $arg = array_shift($args); + array_unshift($args, array($arg)); + + call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args); + } + + /** + * @dataProvider getTests + */ + public function testAllTraversable($method, $args, $success, $multibyte = false) + { + if ($multibyte && !function_exists('mb_strlen')) { + $this->markTestSkipped('The fucntion mb_strlen() is not available'); + + return; + } + + if (!$success) { + $this->setExpectedException('\InvalidArgumentException'); + } + + $arg = array_shift($args); + array_unshift($args, new ArrayIterator(array($arg))); + + call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args); + } + + public function getStringConversions() + { + return array( + array('integer', array('foobar'), 'Expected an integer. Got: string'), + array('string', array(1), 'Expected a string. Got: integer'), + array('string', array(true), 'Expected a string. Got: boolean'), + array('string', array(null), 'Expected a string. Got: NULL'), + array('string', array(array()), 'Expected a string. Got: array'), + array('string', array(new stdClass()), 'Expected a string. Got: stdClass'), + array('string', array(self::getResource()), 'Expected a string. Got: resource'), + + array('eq', array('1', '2'), 'Expected a value equal to "2". Got: "1"'), + array('eq', array(1, 2), 'Expected a value equal to 2. Got: 1'), + array('eq', array(true, false), 'Expected a value equal to false. Got: true'), + array('eq', array(true, null), 'Expected a value equal to null. Got: true'), + array('eq', array(null, true), 'Expected a value equal to true. Got: null'), + array('eq', array(array(1), array(2)), 'Expected a value equal to array. Got: array'), + array('eq', array(new ArrayIterator(array()), new stdClass()), 'Expected a value equal to stdClass. Got: ArrayIterator'), + array('eq', array(1, self::getResource()), 'Expected a value equal to resource. Got: 1'), + ); + } + + /** + * @dataProvider getStringConversions + */ + public function testConvertValuesToStrings($method, $args, $exceptionMessage) + { + $this->setExpectedException('\InvalidArgumentException', $exceptionMessage); + + call_user_func_array(array('Webmozart\Assert\Assert', $method), $args); + } +} From 49f19ee092ece0046747c73ef6fb2692e6047457 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 17:38:37 +0100 Subject: [PATCH 02/16] update compile.js --- compiled.js | 5058 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 3975 insertions(+), 1083 deletions(-) diff --git a/compiled.js b/compiled.js index c69cf171..33e9e443 100644 --- a/compiled.js +++ b/compiled.js @@ -2,8 +2,46 @@ },{}],2:[function(_dereq_,module,exports){ // shim for using process in browser - var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +(function () { + try { + cachedSetTimeout = setTimeout; + } catch (e) { + cachedSetTimeout = function () { + throw new Error('setTimeout is not defined'); + } + } + try { + cachedClearTimeout = clearTimeout; + } catch (e) { + cachedClearTimeout = function () { + throw new Error('clearTimeout is not defined'); + } + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + return setTimeout(fun, 0); + } else { + return cachedSetTimeout.call(null, fun, 0); + } +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + clearTimeout(marker); + } else { + cachedClearTimeout.call(null, marker); + } +} var queue = []; var draining = false; var currentQueue; @@ -28,7 +66,7 @@ function drainQueue() { if (draining) { return; } - var timeout = setTimeout(cleanUpNextTick); + var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; @@ -45,7 +83,7 @@ function drainQueue() { } currentQueue = null; draining = false; - clearTimeout(timeout); + runClearTimeout(timeout); } process.nextTick = function (fun) { @@ -57,7 +95,7 @@ process.nextTick = function (fun) { } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { - setTimeout(drainQueue, 0); + runTimeout(drainQueue); } }; @@ -160,7 +198,7 @@ Button.defaultProps = { ; module.exports = Button; -},{"react":475}],4:[function(_dereq_,module,exports){ +},{"react":496}],4:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -194,7 +232,7 @@ var ButtonGroup = function (_React$Component) { ; module.exports = ButtonGroup; -},{"react":475}],5:[function(_dereq_,module,exports){ +},{"react":496}],5:[function(_dereq_,module,exports){ 'use strict'; exports.Button = _dereq_('./Button'); @@ -213,7 +251,7 @@ function Card(props) { } module.exports = Card; -},{"react":475}],7:[function(_dereq_,module,exports){ +},{"react":496}],7:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -238,7 +276,7 @@ CardContent.propTypes = { module.exports = CardContent; -},{"react":475}],8:[function(_dereq_,module,exports){ +},{"react":496}],8:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -252,7 +290,7 @@ function CardControl(props) { } module.exports = CardControl; -},{"react":475}],9:[function(_dereq_,module,exports){ +},{"react":496}],9:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -360,7 +398,7 @@ CardDrawers.propTypes = { module.exports = CardDrawers; -},{"./CardSection":12,"./CardToolbar":13,"./CardToolbarLink":14,"react":475}],10:[function(_dereq_,module,exports){ +},{"./CardSection":12,"./CardToolbar":13,"./CardToolbarLink":14,"react":496}],10:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -370,7 +408,7 @@ function CardLoadingText(props) { } module.exports = CardLoadingText; -},{"react":475}],11:[function(_dereq_,module,exports){ +},{"react":496}],11:[function(_dereq_,module,exports){ 'use strict'; var React = _dereq_('react'); @@ -399,7 +437,7 @@ CardMessages.propTypes = { module.exports = CardMessages; -},{"react":475}],12:[function(_dereq_,module,exports){ +},{"react":496}],12:[function(_dereq_,module,exports){ 'use strict'; var React = _dereq_('react'); @@ -422,7 +460,7 @@ CardSection.defaultProps = { module.exports = CardSection; -},{"react":475}],13:[function(_dereq_,module,exports){ +},{"react":496}],13:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -452,7 +490,7 @@ CardToolbar.propTypes = { module.exports = CardToolbar; -},{"react":475}],14:[function(_dereq_,module,exports){ +},{"react":496}],14:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -508,7 +546,7 @@ CardToolbarLink.propTypes = { module.exports = CardToolbarLink; -},{"cf-component-link":17,"react":475}],15:[function(_dereq_,module,exports){ +},{"cf-component-link":17,"react":496}],15:[function(_dereq_,module,exports){ 'use strict'; exports.Card = _dereq_('./Card'); @@ -618,7 +656,7 @@ Link.defaultProps = { module.exports = Link; -},{"cf-util-route-handler":18,"react":475}],17:[function(_dereq_,module,exports){ +},{"cf-util-route-handler":18,"react":496}],17:[function(_dereq_,module,exports){ 'use strict'; module.exports = _dereq_('./Link'); @@ -721,7 +759,7 @@ Checkbox.propTypes = { module.exports = Checkbox; -},{"react":475}],21:[function(_dereq_,module,exports){ +},{"react":496}],21:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -798,7 +836,7 @@ CheckboxGroup.propTypes = { module.exports = CheckboxGroup; -},{"./Checkbox":20,"lodash/includes":36,"react":475}],22:[function(_dereq_,module,exports){ +},{"./Checkbox":20,"lodash/includes":38,"react":496}],22:[function(_dereq_,module,exports){ 'use strict'; exports.Checkbox = _dereq_('./Checkbox'); @@ -827,6 +865,32 @@ function arrayMap(array, iteratee) { module.exports = arrayMap; },{}],24:[function(_dereq_,module,exports){ +/** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to search. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ +function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; +} + +module.exports = baseFindIndex; + +},{}],25:[function(_dereq_,module,exports){ var getPrototype = _dereq_('./_getPrototype'); /** Used for built-in method references. */ @@ -854,8 +918,9 @@ function baseHas(object, key) { module.exports = baseHas; -},{"./_getPrototype":31}],25:[function(_dereq_,module,exports){ -var indexOfNaN = _dereq_('./_indexOfNaN'); +},{"./_getPrototype":33}],26:[function(_dereq_,module,exports){ +var baseFindIndex = _dereq_('./_baseFindIndex'), + baseIsNaN = _dereq_('./_baseIsNaN'); /** * The base implementation of `_.indexOf` without `fromIndex` bounds checks. @@ -868,7 +933,7 @@ var indexOfNaN = _dereq_('./_indexOfNaN'); */ function baseIndexOf(array, value, fromIndex) { if (value !== value) { - return indexOfNaN(array, fromIndex); + return baseFindIndex(array, baseIsNaN, fromIndex); } var index = fromIndex - 1, length = array.length; @@ -883,7 +948,23 @@ function baseIndexOf(array, value, fromIndex) { module.exports = baseIndexOf; -},{"./_indexOfNaN":33}],26:[function(_dereq_,module,exports){ +},{"./_baseFindIndex":24,"./_baseIsNaN":27}],27:[function(_dereq_,module,exports){ +/** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ +function baseIsNaN(value) { + return value !== value; +} + +module.exports = baseIsNaN; + +},{}],28:[function(_dereq_,module,exports){ +var overArg = _dereq_('./_overArg'); + /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeKeys = Object.keys; @@ -895,13 +976,11 @@ var nativeKeys = Object.keys; * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */ -function baseKeys(object) { - return nativeKeys(Object(object)); -} +var baseKeys = overArg(nativeKeys, Object); module.exports = baseKeys; -},{}],27:[function(_dereq_,module,exports){ +},{"./_overArg":37}],29:[function(_dereq_,module,exports){ /** * The base implementation of `_.property` without support for deep paths. * @@ -917,7 +996,7 @@ function baseProperty(key) { module.exports = baseProperty; -},{}],28:[function(_dereq_,module,exports){ +},{}],30:[function(_dereq_,module,exports){ /** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. @@ -939,7 +1018,7 @@ function baseTimes(n, iteratee) { module.exports = baseTimes; -},{}],29:[function(_dereq_,module,exports){ +},{}],31:[function(_dereq_,module,exports){ var arrayMap = _dereq_('./_arrayMap'); /** @@ -960,7 +1039,7 @@ function baseValues(object, props) { module.exports = baseValues; -},{"./_arrayMap":23}],30:[function(_dereq_,module,exports){ +},{"./_arrayMap":23}],32:[function(_dereq_,module,exports){ var baseProperty = _dereq_('./_baseProperty'); /** @@ -978,7 +1057,9 @@ var getLength = baseProperty('length'); module.exports = getLength; -},{"./_baseProperty":27}],31:[function(_dereq_,module,exports){ +},{"./_baseProperty":29}],33:[function(_dereq_,module,exports){ +var overArg = _dereq_('./_overArg'); + /* Built-in method references for those with the same name as other `lodash` methods. */ var nativeGetPrototype = Object.getPrototypeOf; @@ -989,13 +1070,11 @@ var nativeGetPrototype = Object.getPrototypeOf; * @param {*} value The value to query. * @returns {null|Object} Returns the `[[Prototype]]`. */ -function getPrototype(value) { - return nativeGetPrototype(Object(value)); -} +var getPrototype = overArg(nativeGetPrototype, Object); module.exports = getPrototype; -},{}],32:[function(_dereq_,module,exports){ +},{"./_overArg":37}],34:[function(_dereq_,module,exports){ var baseTimes = _dereq_('./_baseTimes'), isArguments = _dereq_('./isArguments'), isArray = _dereq_('./isArray'), @@ -1021,32 +1100,7 @@ function indexKeys(object) { module.exports = indexKeys; -},{"./_baseTimes":28,"./isArguments":37,"./isArray":38,"./isLength":42,"./isString":45}],33:[function(_dereq_,module,exports){ -/** - * Gets the index at which the first occurrence of `NaN` is found in `array`. - * - * @private - * @param {Array} array The array to search. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched `NaN`, else `-1`. - */ -function indexOfNaN(array, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); - - while ((fromRight ? index-- : ++index < length)) { - var other = array[index]; - if (other !== other) { - return index; - } - } - return -1; -} - -module.exports = indexOfNaN; - -},{}],34:[function(_dereq_,module,exports){ +},{"./_baseTimes":30,"./isArguments":39,"./isArray":40,"./isLength":44,"./isString":47}],35:[function(_dereq_,module,exports){ /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; @@ -1070,7 +1124,7 @@ function isIndex(value, length) { module.exports = isIndex; -},{}],35:[function(_dereq_,module,exports){ +},{}],36:[function(_dereq_,module,exports){ /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -1090,7 +1144,24 @@ function isPrototype(value) { module.exports = isPrototype; -},{}],36:[function(_dereq_,module,exports){ +},{}],37:[function(_dereq_,module,exports){ +/** + * Creates a function that invokes `func` with its first argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ +function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; +} + +module.exports = overArg; + +},{}],38:[function(_dereq_,module,exports){ var baseIndexOf = _dereq_('./_baseIndexOf'), isArrayLike = _dereq_('./isArrayLike'), isString = _dereq_('./isString'), @@ -1124,10 +1195,10 @@ var nativeMax = Math.max; * _.includes([1, 2, 3], 1, 2); * // => false * - * _.includes({ 'user': 'fred', 'age': 40 }, 'fred'); + * _.includes({ 'a': 1, 'b': 2 }, 1); * // => true * - * _.includes('pebbles', 'eb'); + * _.includes('abcd', 'bc'); * // => true */ function includes(collection, value, fromIndex, guard) { @@ -1145,7 +1216,7 @@ function includes(collection, value, fromIndex, guard) { module.exports = includes; -},{"./_baseIndexOf":25,"./isArrayLike":39,"./isString":45,"./toInteger":49,"./values":51}],37:[function(_dereq_,module,exports){ +},{"./_baseIndexOf":26,"./isArrayLike":41,"./isString":47,"./toInteger":51,"./values":53}],39:[function(_dereq_,module,exports){ var isArrayLikeObject = _dereq_('./isArrayLikeObject'); /** `Object#toString` result references. */ @@ -1175,7 +1246,7 @@ var propertyIsEnumerable = objectProto.propertyIsEnumerable; * @since 0.1.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, + * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * @@ -1193,18 +1264,16 @@ function isArguments(value) { module.exports = isArguments; -},{"./isArrayLikeObject":40}],38:[function(_dereq_,module,exports){ +},{"./isArrayLikeObject":42}],40:[function(_dereq_,module,exports){ /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 - * @type {Function} * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, - * else `false`. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); @@ -1223,7 +1292,7 @@ var isArray = Array.isArray; module.exports = isArray; -},{}],39:[function(_dereq_,module,exports){ +},{}],41:[function(_dereq_,module,exports){ var getLength = _dereq_('./_getLength'), isFunction = _dereq_('./isFunction'), isLength = _dereq_('./isLength'); @@ -1259,7 +1328,7 @@ function isArrayLike(value) { module.exports = isArrayLike; -},{"./_getLength":30,"./isFunction":41,"./isLength":42}],40:[function(_dereq_,module,exports){ +},{"./_getLength":32,"./isFunction":43,"./isLength":44}],42:[function(_dereq_,module,exports){ var isArrayLike = _dereq_('./isArrayLike'), isObjectLike = _dereq_('./isObjectLike'); @@ -1294,7 +1363,7 @@ function isArrayLikeObject(value) { module.exports = isArrayLikeObject; -},{"./isArrayLike":39,"./isObjectLike":44}],41:[function(_dereq_,module,exports){ +},{"./isArrayLike":41,"./isObjectLike":46}],43:[function(_dereq_,module,exports){ var isObject = _dereq_('./isObject'); /** `Object#toString` result references. */ @@ -1319,8 +1388,7 @@ var objectToString = objectProto.toString; * @since 0.1.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, - * else `false`. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); @@ -1339,7 +1407,7 @@ function isFunction(value) { module.exports = isFunction; -},{"./isObject":43}],42:[function(_dereq_,module,exports){ +},{"./isObject":45}],44:[function(_dereq_,module,exports){ /** Used as references for various `Number` constants. */ var MAX_SAFE_INTEGER = 9007199254740991; @@ -1377,7 +1445,7 @@ function isLength(value) { module.exports = isLength; -},{}],43:[function(_dereq_,module,exports){ +},{}],45:[function(_dereq_,module,exports){ /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types) @@ -1410,7 +1478,7 @@ function isObject(value) { module.exports = isObject; -},{}],44:[function(_dereq_,module,exports){ +},{}],46:[function(_dereq_,module,exports){ /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". @@ -1441,7 +1509,7 @@ function isObjectLike(value) { module.exports = isObjectLike; -},{}],45:[function(_dereq_,module,exports){ +},{}],47:[function(_dereq_,module,exports){ var isArray = _dereq_('./isArray'), isObjectLike = _dereq_('./isObjectLike'); @@ -1466,8 +1534,7 @@ var objectToString = objectProto.toString; * @memberOf _ * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, - * else `false`. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. * @example * * _.isString('abc'); @@ -1483,7 +1550,7 @@ function isString(value) { module.exports = isString; -},{"./isArray":38,"./isObjectLike":44}],46:[function(_dereq_,module,exports){ +},{"./isArray":40,"./isObjectLike":46}],48:[function(_dereq_,module,exports){ var isObjectLike = _dereq_('./isObjectLike'); /** `Object#toString` result references. */ @@ -1507,8 +1574,7 @@ var objectToString = objectProto.toString; * @since 4.0.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, - * else `false`. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); @@ -1524,7 +1590,7 @@ function isSymbol(value) { module.exports = isSymbol; -},{"./isObjectLike":44}],47:[function(_dereq_,module,exports){ +},{"./isObjectLike":46}],49:[function(_dereq_,module,exports){ var baseHas = _dereq_('./_baseHas'), baseKeys = _dereq_('./_baseKeys'), indexKeys = _dereq_('./_indexKeys'), @@ -1582,7 +1648,7 @@ function keys(object) { module.exports = keys; -},{"./_baseHas":24,"./_baseKeys":26,"./_indexKeys":32,"./_isIndex":34,"./_isPrototype":35,"./isArrayLike":39}],48:[function(_dereq_,module,exports){ +},{"./_baseHas":25,"./_baseKeys":28,"./_indexKeys":34,"./_isIndex":35,"./_isPrototype":36,"./isArrayLike":41}],50:[function(_dereq_,module,exports){ var toNumber = _dereq_('./toNumber'); /** Used as references for various `Number` constants. */ @@ -1626,7 +1692,7 @@ function toFinite(value) { module.exports = toFinite; -},{"./toNumber":50}],49:[function(_dereq_,module,exports){ +},{"./toNumber":52}],51:[function(_dereq_,module,exports){ var toFinite = _dereq_('./toFinite'); /** @@ -1664,7 +1730,7 @@ function toInteger(value) { module.exports = toInteger; -},{"./toFinite":48}],50:[function(_dereq_,module,exports){ +},{"./toFinite":50}],52:[function(_dereq_,module,exports){ var isFunction = _dereq_('./isFunction'), isObject = _dereq_('./isObject'), isSymbol = _dereq_('./isSymbol'); @@ -1733,7 +1799,7 @@ function toNumber(value) { module.exports = toNumber; -},{"./isFunction":41,"./isObject":43,"./isSymbol":46}],51:[function(_dereq_,module,exports){ +},{"./isFunction":43,"./isObject":45,"./isSymbol":48}],53:[function(_dereq_,module,exports){ var baseValues = _dereq_('./_baseValues'), keys = _dereq_('./keys'); @@ -1769,7 +1835,320 @@ function values(object) { module.exports = values; -},{"./_baseValues":29,"./keys":47}],52:[function(_dereq_,module,exports){ +},{"./_baseValues":31,"./keys":49}],54:[function(_dereq_,module,exports){ +(function (global){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var React = _dereq_('react'); +var PropTypes = React.PropTypes; + +var DropdownRegistry = _dereq_('./DropdownRegistry'); + +var _require = _dereq_('exenv'); + +var canUseDOM = _require.canUseDOM; + +var Dropdown = function (_React$Component) { + _inherits(Dropdown, _React$Component); + + Dropdown.prototype.getChildContext = function getChildContext() { + return { + dropdownRegistry: this.dropdownRegistry + }; + }; + + function Dropdown(props, context) { + _classCallCheck(this, Dropdown); + + var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context)); + + _this.handleDocumentKeydown = function (event) { + var keyCode = event.keyCode; + + if (keyCode === 40) { + // down + event.preventDefault(); + _this.dropdownRegistry.focusNext(); + } else if (keyCode === 38) { + // up + event.preventDefault(); + _this.dropdownRegistry.focusPrev(); + } else if (keyCode === 27) { + // esc + _this.props.onClose(); + } + }; + + _this.handleDocumentClick = function (event) { + _this.props.onClose(); + }; + + _this.dropdownRegistry = new DropdownRegistry(); + return _this; + } + + Dropdown.prototype.componentDidMount = function componentDidMount() { + if (canUseDOM) { + global.document.addEventListener('keydown', this.handleDocumentKeydown); + global.document.addEventListener('click', this.handleDocumentClick); + } + }; + + Dropdown.prototype.componentWillUnmount = function componentWillUnmount() { + if (canUseDOM) { + global.document.removeEventListener('keydown', this.handleDocumentKeydown); + global.document.removeEventListener('click', this.handleDocumentClick); + } + }; + + Dropdown.prototype.render = function render() { + return React.createElement( + 'ul', + { role: 'menu', className: 'cf-dropdown cf-dropdown--' + this.props.align }, + this.props.children + ); + }; + + return Dropdown; +}(React.Component); + +Dropdown.propTypes = { + onClose: PropTypes.func.isRequired, + align: PropTypes.oneOf(['left', 'right']) +}; +Dropdown.defaultProps = { + align: 'left' +}; +Dropdown.childContextTypes = { + dropdownRegistry: PropTypes.instanceOf(DropdownRegistry).isRequired +}; + + +module.exports = Dropdown; +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./DropdownRegistry":56,"exenv":63,"react":496}],55:[function(_dereq_,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var React = _dereq_('react'); +var PropTypes = React.PropTypes; + +var _require = _dereq_('react-dom'); + +var findDOMNode = _require.findDOMNode; + +var Link = _dereq_('cf-component-link'); +var DropdownRegistry = _dereq_('./DropdownRegistry'); + +var DropdownLink = function (_React$Component) { + _inherits(DropdownLink, _React$Component); + + function DropdownLink(props, context) { + _classCallCheck(this, DropdownLink); + + if (!props.to && !props.onClick) { + throw new Error(' requires either a `to` or `onClick` prop'); + } + + var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context)); + + _this.handleLinkFocus = function (e) { + _this.dropdownRegistry.setFocusedChild(_this); + }; + + _this.handleLinkBlur = function (e) { + _this.dropdownRegistry.removeFocusedChild(); + }; + + _this.dropdownRegistry = context.dropdownRegistry; + return _this; + } + + DropdownLink.prototype.componentWillMount = function componentWillMount() { + this.dropdownRegistry.addChild(this); + }; + + DropdownLink.prototype.componentWillUnmount = function componentWillUnmount() { + this.dropdownRegistry.removeChild(this); + }; + + DropdownLink.prototype.focus = function focus() { + findDOMNode(this.refs.link).focus(); + }; + + DropdownLink.prototype.render = function render() { + return React.createElement( + 'li', + { className: 'cf-dropdown__link', role: 'menuitem' }, + React.createElement( + Link, + { ref: 'link', + to: this.props.to, + onClick: this.props.onClick, + onFocus: this.handleLinkFocus, + onBlur: this.handleLinkBlur }, + this.props.children + ) + ); + }; + + return DropdownLink; +}(React.Component); + +DropdownLink.propTypes = { + to: PropTypes.string, + onClick: PropTypes.func +}; +DropdownLink.contextTypes = { + dropdownRegistry: PropTypes.instanceOf(DropdownRegistry).isRequired +}; + + +module.exports = DropdownLink; +},{"./DropdownRegistry":56,"cf-component-link":60,"react":496,"react-dom":259}],56:[function(_dereq_,module,exports){ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var DropdownRegistry = function () { + function DropdownRegistry() { + _classCallCheck(this, DropdownRegistry); + + this._links = []; + this._currentFocusIndex = -1; + } + + DropdownRegistry.prototype.addChild = function addChild(child) { + this._links.push(child); + }; + + DropdownRegistry.prototype.removeChild = function removeChild(child) { + this._links.splice(this._links.indexOf(child), 1); + }; + + DropdownRegistry.prototype._focusChildAt = function _focusChildAt(index) { + if (this._links[index]) { + this._links[index].focus(); + } + }; + + DropdownRegistry.prototype.focusNext = function focusNext() { + this._focusChildAt(this._currentFocusIndex + 1); + }; + + DropdownRegistry.prototype.focusPrev = function focusPrev() { + this._focusChildAt(this._currentFocusIndex - 1); + }; + + DropdownRegistry.prototype.setFocusedChild = function setFocusedChild(child) { + this._currentFocusIndex = this._links.indexOf(child); + }; + + DropdownRegistry.prototype.removeFocusedChild = function removeFocusedChild(child) { + this._currentFocusIndex = -1; + }; + + return DropdownRegistry; +}(); + +module.exports = DropdownRegistry; +},{}],57:[function(_dereq_,module,exports){ +"use strict"; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var React = _dereq_('react'); + +var DropdownSeparator = function (_React$Component) { + _inherits(DropdownSeparator, _React$Component); + + function DropdownSeparator() { + _classCallCheck(this, DropdownSeparator); + + return _possibleConstructorReturn(this, _React$Component.apply(this, arguments)); + } + + DropdownSeparator.prototype.render = function render() { + return React.createElement("div", { className: "cf-dropdown__separator", role: "separator" }); + }; + + return DropdownSeparator; +}(React.Component); + +module.exports = DropdownSeparator; +},{"react":496}],58:[function(_dereq_,module,exports){ +'use strict'; + +exports.Dropdown = _dereq_('./Dropdown'); +exports.DropdownLink = _dereq_('./DropdownLink'); +exports.DropdownSeparator = _dereq_('./DropdownSeparator'); +},{"./Dropdown":54,"./DropdownLink":55,"./DropdownSeparator":57}],59:[function(_dereq_,module,exports){ +arguments[4][16][0].apply(exports,arguments) +},{"cf-util-route-handler":61,"dup":16,"react":496}],60:[function(_dereq_,module,exports){ +arguments[4][17][0].apply(exports,arguments) +},{"./Link":59,"dup":17}],61:[function(_dereq_,module,exports){ +arguments[4][18][0].apply(exports,arguments) +},{"./routeHandler":62,"dup":18}],62:[function(_dereq_,module,exports){ +arguments[4][19][0].apply(exports,arguments) +},{"dup":19}],63:[function(_dereq_,module,exports){ +/*! + Copyright (c) 2015 Jed Watson. + Based on code that is Copyright 2013-2015, Facebook, Inc. + All rights reserved. +*/ +/* global define */ + +(function () { + 'use strict'; + + var canUseDOM = !!( + typeof window !== 'undefined' && + window.document && + window.document.createElement + ); + + var ExecutionEnvironment = { + + canUseDOM: canUseDOM, + + canUseWorkers: typeof Worker !== 'undefined', + + canUseEventListeners: + canUseDOM && !!(window.addEventListener || window.attachEvent), + + canUseViewport: canUseDOM && !!window.screen + + }; + + if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + define(function () { + return ExecutionEnvironment; + }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = ExecutionEnvironment; + } else { + window.ExecutionEnvironment = ExecutionEnvironment; + } + +}()); + +},{}],64:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1805,7 +2184,7 @@ Heading.propTypes = { module.exports = Heading; -},{"react":475}],53:[function(_dereq_,module,exports){ +},{"react":496}],65:[function(_dereq_,module,exports){ "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1837,12 +2216,12 @@ var HeadingCaption = function (_React$Component) { }(React.Component); module.exports = HeadingCaption; -},{"react":475}],54:[function(_dereq_,module,exports){ +},{"react":496}],66:[function(_dereq_,module,exports){ 'use strict'; exports.Heading = _dereq_('./Heading'); exports.HeadingCaption = _dereq_('./HeadingCaption'); -},{"./Heading":52,"./HeadingCaption":53}],55:[function(_dereq_,module,exports){ +},{"./Heading":64,"./HeadingCaption":65}],67:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1881,7 +2260,7 @@ LayoutColumn.propTypes = { module.exports = LayoutColumn; -},{"react":475}],56:[function(_dereq_,module,exports){ +},{"react":496}],68:[function(_dereq_,module,exports){ "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1913,7 +2292,7 @@ var LayoutContainer = function (_React$Component) { }(React.Component); module.exports = LayoutContainer; -},{"react":475}],57:[function(_dereq_,module,exports){ +},{"react":496}],69:[function(_dereq_,module,exports){ "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1945,13 +2324,13 @@ var LayoutRow = function (_React$Component) { }(React.Component); module.exports = LayoutRow; -},{"react":475}],58:[function(_dereq_,module,exports){ +},{"react":496}],70:[function(_dereq_,module,exports){ 'use strict'; exports.LayoutContainer = _dereq_('./LayoutContainer'); exports.LayoutRow = _dereq_('./LayoutRow'); exports.LayoutColumn = _dereq_('./LayoutColumn'); -},{"./LayoutColumn":55,"./LayoutContainer":56,"./LayoutRow":57}],59:[function(_dereq_,module,exports){ +},{"./LayoutColumn":67,"./LayoutContainer":68,"./LayoutRow":69}],71:[function(_dereq_,module,exports){ 'use strict'; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } @@ -2050,9 +2429,9 @@ Link.defaultProps = { }; module.exports = Link; -},{"cf-util-route-handler":61,"react":475}],60:[function(_dereq_,module,exports){ +},{"cf-util-route-handler":73,"react":496}],72:[function(_dereq_,module,exports){ arguments[4][17][0].apply(exports,arguments) -},{"./Link":59,"dup":17}],61:[function(_dereq_,module,exports){ +},{"./Link":71,"dup":17}],73:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -2075,7 +2454,7 @@ function routeTo(url) { handler(url); } -},{}],62:[function(_dereq_,module,exports){ +},{}],74:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -2126,7 +2505,7 @@ List.defaultProps = { module.exports = List; -},{"react":475}],63:[function(_dereq_,module,exports){ +},{"react":496}],75:[function(_dereq_,module,exports){ "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -2158,12 +2537,12 @@ var ListItem = function (_React$Component) { }(React.Component); module.exports = ListItem; -},{"react":475}],64:[function(_dereq_,module,exports){ +},{"react":496}],76:[function(_dereq_,module,exports){ 'use strict'; exports.List = _dereq_('./List'); exports.ListItem = _dereq_('./ListItem'); -},{"./List":62,"./ListItem":63}],65:[function(_dereq_,module,exports){ +},{"./List":74,"./ListItem":75}],77:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -2250,7 +2629,7 @@ Modal.defaultProps = { }; module.exports = Modal; -},{"react":475,"react-addons-css-transition-group":235,"react-gateway":244,"react-modal2":74}],66:[function(_dereq_,module,exports){ +},{"react":496,"react-addons-css-transition-group":255,"react-gateway":264,"react-modal2":86}],78:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -2264,7 +2643,7 @@ function ModalActions(props) { } module.exports = ModalActions; -},{"react":475}],67:[function(_dereq_,module,exports){ +},{"react":496}],79:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -2278,7 +2657,7 @@ function ModalBody(props) { } module.exports = ModalBody; -},{"react":475}],68:[function(_dereq_,module,exports){ +},{"react":496}],80:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -2293,7 +2672,7 @@ ModalClose.propTypes = { }; module.exports = ModalClose; -},{"react":475}],69:[function(_dereq_,module,exports){ +},{"react":496}],81:[function(_dereq_,module,exports){ 'use strict'; var React = _dereq_('react'); @@ -2321,7 +2700,7 @@ ModalFooter.defaultProps = { }; module.exports = ModalFooter; -},{"react":475}],70:[function(_dereq_,module,exports){ +},{"react":496}],82:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -2335,7 +2714,7 @@ function ModalHeader(props) { } module.exports = ModalHeader; -},{"react":475}],71:[function(_dereq_,module,exports){ +},{"react":496}],83:[function(_dereq_,module,exports){ "use strict"; var React = _dereq_('react'); @@ -2349,7 +2728,7 @@ function ModalTitle(props) { } module.exports = ModalTitle; -},{"react":475}],72:[function(_dereq_,module,exports){ +},{"react":496}],84:[function(_dereq_,module,exports){ 'use strict'; exports.Modal = _dereq_('./Modal'); @@ -2359,7 +2738,7 @@ exports.ModalClose = _dereq_('./ModalClose'); exports.ModalFooter = _dereq_('./ModalFooter'); exports.ModalHeader = _dereq_('./ModalHeader'); exports.ModalTitle = _dereq_('./ModalTitle'); -},{"./Modal":65,"./ModalActions":66,"./ModalBody":67,"./ModalClose":68,"./ModalFooter":69,"./ModalHeader":70,"./ModalTitle":71}],73:[function(_dereq_,module,exports){ +},{"./Modal":77,"./ModalActions":78,"./ModalBody":79,"./ModalClose":80,"./ModalFooter":81,"./ModalHeader":82,"./ModalTitle":83}],85:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -2400,7 +2779,7 @@ function resetFocus(applicationElement) { _a11yFocusStore2.default.restoreFocus(); } -var ReactModal2 = (function (_React$Component) { +var ReactModal2 = function (_React$Component) { _inherits(ReactModal2, _React$Component); function ReactModal2() { @@ -2463,7 +2842,7 @@ var ReactModal2 = (function (_React$Component) { }; return ReactModal2; -})(_react2.default.Component); +}(_react2.default.Component); ReactModal2.propTypes = { onClose: _react2.default.PropTypes.func.isRequired, @@ -2482,7 +2861,7 @@ ReactModal2.defaultProps = { closeOnBackdropClick: true }; exports.default = ReactModal2; -},{"a11y-focus-scope":75,"a11y-focus-store":78,"exenv":79,"react":475}],74:[function(_dereq_,module,exports){ +},{"a11y-focus-scope":87,"a11y-focus-store":90,"exenv":91,"react":496}],86:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -2495,7 +2874,7 @@ var _Modal2 = _interopRequireDefault(_Modal); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = _Modal2.default; -},{"./Modal":73}],75:[function(_dereq_,module,exports){ +},{"./Modal":85}],87:[function(_dereq_,module,exports){ 'use strict'; var tabbable = _dereq_('tabbable'); @@ -2541,7 +2920,7 @@ exports.unscopeFocus = function() { teardownFn = null; }; -},{"focusin":76,"tabbable":77}],76:[function(_dereq_,module,exports){ +},{"focusin":88,"tabbable":89}],88:[function(_dereq_,module,exports){ /* from https://gist.github.com/nuxodin/9250e56a3ce6c0446efa */ function polyfill () { @@ -2580,13 +2959,13 @@ module.exports = { polyfill: polyfill } -},{}],77:[function(_dereq_,module,exports){ +},{}],89:[function(_dereq_,module,exports){ module.exports = function(el) { var basicTabbables = []; var orderedTabbables = []; + var isHidden = createIsHidden(); - var candidateNodelist = el.querySelectorAll('input, select, a, textarea, button, [tabindex]'); - var candidates = Array.prototype.slice.call(candidateNodelist); + var candidates = el.querySelectorAll('input, select, a[href], textarea, button, [tabindex]'); var candidate, candidateIndex; for (var i = 0, l = candidates.length; i < l; i++) { @@ -2596,7 +2975,6 @@ module.exports = function(el) { if ( candidateIndex < 0 || (candidate.tagName === 'INPUT' && candidate.type === 'hidden') - || (candidate.tagName === 'A' && !candidate.href && !candidate.tabIndex) || candidate.disabled || isHidden(candidate) ) { @@ -2626,33 +3004,34 @@ module.exports = function(el) { return tabbableNodes; } -var nodeCache = {}; -var nodeCacheIndex = 1; -function isHidden(node) { - if (node === document.documentElement) { - return false; - } +function createIsHidden() { + // Node cache must be refreshed on every check, in case + // the content of the element has changed + var nodeCache = []; - if (node.tabbableCacheIndex) { - return nodeCache[node.tabbableCacheIndex]; - } + return function isHidden(node) { + if (node === document.documentElement) return false; - var result = false; - var style = window.getComputedStyle(node); - if (style.visibility === 'hidden' || style.display === 'none') { - result = true; - } else if (node.parentNode) { - result = isHidden(node.parentNode); - } + // Find the cached node (Array.prototype.find not available in IE9) + for (var i = 0, length = nodeCache.length; i < length; i++) { + if (nodeCache[i][0] === node) return nodeCache[i][1]; + } + + var result = false; + var style = window.getComputedStyle(node); + if (style.visibility === 'hidden' || style.display === 'none') { + result = true; + } else if (node.parentNode) { + result = isHidden(node.parentNode); + } - node.tabbableCacheIndex = nodeCacheIndex; - nodeCache[node.tabbableCacheIndex] = result; - nodeCacheIndex++; + nodeCache.push([node, result]); - return result; + return result; + } } -},{}],78:[function(_dereq_,module,exports){ +},{}],90:[function(_dereq_,module,exports){ 'use strict'; var storedFocusElement; @@ -2671,49 +3050,9 @@ exports.restoreFocus = function() { storedFocusElement = null; }; -},{}],79:[function(_dereq_,module,exports){ -/*! - Copyright (c) 2015 Jed Watson. - Based on code that is Copyright 2013-2015, Facebook, Inc. - All rights reserved. -*/ -/* global define */ - -(function () { - 'use strict'; - - var canUseDOM = !!( - typeof window !== 'undefined' && - window.document && - window.document.createElement - ); - - var ExecutionEnvironment = { - - canUseDOM: canUseDOM, - - canUseWorkers: typeof Worker !== 'undefined', - - canUseEventListeners: - canUseDOM && !!(window.addEventListener || window.attachEvent), - - canUseViewport: canUseDOM && !!window.screen - - }; - - if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { - define(function () { - return ExecutionEnvironment; - }); - } else if (typeof module !== 'undefined' && module.exports) { - module.exports = ExecutionEnvironment; - } else { - window.ExecutionEnvironment = ExecutionEnvironment; - } - -}()); - -},{}],80:[function(_dereq_,module,exports){ +},{}],91:[function(_dereq_,module,exports){ +arguments[4][63][0].apply(exports,arguments) +},{"dup":63}],92:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -2780,7 +3119,7 @@ Radio.propTypes = { module.exports = Radio; -},{"react":475}],81:[function(_dereq_,module,exports){ +},{"react":496}],93:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -2836,12 +3175,12 @@ RadioGroup.propTypes = { module.exports = RadioGroup; -},{"./Radio":80,"react":475}],82:[function(_dereq_,module,exports){ +},{"./Radio":92,"react":496}],94:[function(_dereq_,module,exports){ 'use strict'; exports.Radio = _dereq_('./Radio'); exports.RadioGroup = _dereq_('./RadioGroup'); -},{"./Radio":80,"./RadioGroup":81}],83:[function(_dereq_,module,exports){ +},{"./Radio":92,"./RadioGroup":93}],95:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -2917,11 +3256,11 @@ Select.defaultProps = { ; module.exports = Select; -},{"react":475,"react-select":86}],84:[function(_dereq_,module,exports){ +},{"react":496,"react-select":98}],96:[function(_dereq_,module,exports){ 'use strict'; module.exports = _dereq_('./Select'); -},{"./Select":83}],85:[function(_dereq_,module,exports){ +},{"./Select":95}],97:[function(_dereq_,module,exports){ 'use strict'; var React = _dereq_('react'); @@ -2986,7 +3325,7 @@ var Option = React.createClass({ }); module.exports = Option; -},{"classnames":89,"react":475}],86:[function(_dereq_,module,exports){ +},{"classnames":101,"react":496}],98:[function(_dereq_,module,exports){ /* disable some rules until we refactor more completely; fixing them now would cause conflicts with some open PRs unnecessarily. */ /* eslint react/jsx-sort-prop-types: 0, react/sort-comp: 0, react/prop-types: 0 */ @@ -3934,7 +4273,7 @@ var Select = React.createClass({ }); module.exports = Select; -},{"./Option":85,"./SingleValue":87,"./Value":88,"classnames":89,"react":475,"react-dom":239,"react-input-autosize":90}],87:[function(_dereq_,module,exports){ +},{"./Option":97,"./SingleValue":99,"./Value":100,"classnames":101,"react":496,"react-dom":259,"react-input-autosize":102}],99:[function(_dereq_,module,exports){ 'use strict'; var React = _dereq_('react'); @@ -3962,7 +4301,7 @@ var SingleValue = React.createClass({ }); module.exports = SingleValue; -},{"classnames":89,"react":475}],88:[function(_dereq_,module,exports){ +},{"classnames":101,"react":496}],100:[function(_dereq_,module,exports){ 'use strict'; var React = _dereq_('react'); @@ -4046,7 +4385,7 @@ var Value = React.createClass({ }); module.exports = Value; -},{"classnames":89,"react":475}],89:[function(_dereq_,module,exports){ +},{"classnames":101,"react":496}],101:[function(_dereq_,module,exports){ /*! Copyright (c) 2016 Jed Watson. Licensed under the MIT License (MIT), see @@ -4096,7 +4435,7 @@ module.exports = Value; } }()); -},{}],90:[function(_dereq_,module,exports){ +},{}],102:[function(_dereq_,module,exports){ 'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; @@ -4223,7 +4562,7 @@ var AutosizeInput = React.createClass({ }); module.exports = AutosizeInput; -},{"react":475}],91:[function(_dereq_,module,exports){ +},{"react":496}],103:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4280,7 +4619,7 @@ Table.defaultProps = { condensed: false }; exports.default = Table; -},{"react":475}],92:[function(_dereq_,module,exports){ +},{"react":496}],104:[function(_dereq_,module,exports){ "use strict"; exports.__esModule = true; @@ -4318,7 +4657,7 @@ var TableBody = (function (_React$Component) { })(_react2.default.Component); exports.default = TableBody; -},{"react":475}],93:[function(_dereq_,module,exports){ +},{"react":496}],105:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4364,7 +4703,7 @@ TableCell.propTypes = { editable: _react.PropTypes.bool }; exports.default = TableCell; -},{"react":475}],94:[function(_dereq_,module,exports){ +},{"react":496}],106:[function(_dereq_,module,exports){ "use strict"; exports.__esModule = true; @@ -4402,7 +4741,7 @@ var TableFoot = (function (_React$Component) { })(_react2.default.Component); exports.default = TableFoot; -},{"react":475}],95:[function(_dereq_,module,exports){ +},{"react":496}],107:[function(_dereq_,module,exports){ "use strict"; exports.__esModule = true; @@ -4440,7 +4779,7 @@ var TableHead = (function (_React$Component) { })(_react2.default.Component); exports.default = TableHead; -},{"react":475}],96:[function(_dereq_,module,exports){ +},{"react":496}],108:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4486,7 +4825,7 @@ TableCell.propTypes = { editable: _react.PropTypes.bool }; exports.default = TableCell; -},{"react":475}],97:[function(_dereq_,module,exports){ +},{"react":496}],109:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4538,7 +4877,7 @@ Table.defaultProps = { accent: false }; exports.default = Table; -},{"react":475}],98:[function(_dereq_,module,exports){ +},{"react":496}],110:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -4581,7 +4920,7 @@ exports.TableFoot = _TableFoot3.default; exports.TableHead = _TableHead3.default; exports.TableHeadCell = _TableHeadCell3.default; exports.TableRow = _TableRow3.default; -},{"./Table":91,"./TableBody":92,"./TableCell":93,"./TableFoot":94,"./TableHead":95,"./TableHeadCell":96,"./TableRow":97}],99:[function(_dereq_,module,exports){ +},{"./Table":103,"./TableBody":104,"./TableCell":105,"./TableFoot":106,"./TableHead":107,"./TableHeadCell":108,"./TableRow":109}],111:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -4692,7 +5031,7 @@ Tabs.childContextTypes = { module.exports = Tabs; -},{"cf-component-select":84,"cf-component-viewport":104,"react":475}],100:[function(_dereq_,module,exports){ +},{"cf-component-select":96,"cf-component-viewport":116,"react":496}],112:[function(_dereq_,module,exports){ "use strict"; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -4740,12 +5079,12 @@ TabsPanel.contextTypes = { module.exports = TabsPanel; -},{"react":475}],101:[function(_dereq_,module,exports){ +},{"react":496}],113:[function(_dereq_,module,exports){ 'use strict'; exports.Tabs = _dereq_('./Tabs'); exports.TabsPanel = _dereq_('./TabsPanel'); -},{"./Tabs":99,"./TabsPanel":100}],102:[function(_dereq_,module,exports){ +},{"./Tabs":111,"./TabsPanel":112}],114:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -4804,7 +5143,7 @@ Viewport.defaultProps = { module.exports = Viewport; -},{"./buildMediaQuery":103,"react":475,"react-responsive":109}],103:[function(_dereq_,module,exports){ +},{"./buildMediaQuery":115,"react":496,"react-responsive":121}],115:[function(_dereq_,module,exports){ 'use strict'; function buildMediaQuery(_ref, not) { @@ -4833,11 +5172,11 @@ function buildMediaQuery(_ref, not) { } module.exports = buildMediaQuery; -},{}],104:[function(_dereq_,module,exports){ +},{}],116:[function(_dereq_,module,exports){ 'use strict'; module.exports = _dereq_('./Viewport'); -},{"./Viewport":102}],105:[function(_dereq_,module,exports){ +},{"./Viewport":114}],117:[function(_dereq_,module,exports){ 'use strict'; var uppercasePattern = /[A-Z]/g; @@ -4852,7 +5191,7 @@ function hyphenateStyleName(string) { module.exports = hyphenateStyleName; -},{}],106:[function(_dereq_,module,exports){ +},{}],118:[function(_dereq_,module,exports){ 'use strict'; var staticMatch = _dereq_('css-mediaquery').match; @@ -4900,7 +5239,7 @@ function matchMedia(query, values){ module.exports = matchMedia; -},{"css-mediaquery":107}],107:[function(_dereq_,module,exports){ +},{"css-mediaquery":119}],119:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -5059,7 +5398,7 @@ function toPx(length) { } } -},{}],108:[function(_dereq_,module,exports){ +},{}],120:[function(_dereq_,module,exports){ 'use strict'; /* eslint-disable no-unused-vars */ var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -5144,7 +5483,7 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) { return to; }; -},{}],109:[function(_dereq_,module,exports){ +},{}],121:[function(_dereq_,module,exports){ 'use strict'; var React = _dereq_('react'); @@ -5245,7 +5584,8 @@ var mq = React.createClass({ var hasMergeProps = Object.keys(props).length > 0; var wrapChildren = this.props.component || React.Children.count(this.props.children) > 1 || - typeof this.props.children === 'string'; + typeof this.props.children === 'string' || + this.props.children === undefined; if (wrapChildren) { return React.createElement( this.props.component || 'div', @@ -5265,7 +5605,7 @@ var mq = React.createClass({ module.exports = mq; -},{"./mediaQuery":110,"./toQuery":111,"hyphenate-style-name":105,"matchmedia":106,"object-assign":108,"react":475}],110:[function(_dereq_,module,exports){ +},{"./mediaQuery":122,"./toQuery":123,"hyphenate-style-name":117,"matchmedia":118,"object-assign":120,"react":496}],122:[function(_dereq_,module,exports){ var PropTypes = _dereq_('react').PropTypes; var assign = _dereq_('object-assign'); @@ -5364,7 +5704,7 @@ module.exports = { features: features }; -},{"object-assign":108,"react":475}],111:[function(_dereq_,module,exports){ +},{"object-assign":120,"react":496}],123:[function(_dereq_,module,exports){ 'use strict'; var hyphenate = _dereq_('hyphenate-style-name'); @@ -5405,7 +5745,86 @@ module.exports = function(obj){ return join(rules); }; -},{"./mediaQuery":110,"hyphenate-style-name":105}],112:[function(_dereq_,module,exports){ +},{"./mediaQuery":122,"hyphenate-style-name":117}],124:[function(_dereq_,module,exports){ +'use strict'; + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var React = _dereq_('react'); +var PropTypes = React.PropTypes; + +var requiredIf = _dereq_('react-required-if'); + +var Textarea = function (_React$Component) { + _inherits(Textarea, _React$Component); + + function Textarea() { + var _temp, _this, _ret; + + _classCallCheck(this, Textarea); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.handleChange = function (e) { + if (_this.props.onChange) { + _this.props.onChange(e.target.value); + } + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + Textarea.prototype.render = function render() { + var className = 'cf-textarea'; + + if (this.props.disabled) className += ' cf-textarea--disabled'; + if (this.props.readOnly) className += ' cf-textarea--readonly'; + + return React.createElement('textarea', { + className: className, + name: this.props.name, + value: this.props.value, + disabled: this.props.disabled, + readOnly: this.props.readOnly, + onChange: this.handleChange, + onFocus: this.props.onFocus, + onBlur: this.props.onBlur }); + }; + + return Textarea; +}(React.Component); + +Textarea.propTypes = { + name: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + disabled: PropTypes.bool, + readOnly: PropTypes.bool, + onChange: requiredIf(PropTypes.func, function (props) { + return !props.disabled && !props.readOnly; + }), + onFocus: PropTypes.func, + onBlur: PropTypes.func +}; + + +module.exports = Textarea; +},{"react":496,"react-required-if":126}],125:[function(_dereq_,module,exports){ +'use strict'; + +module.exports = _dereq_('./Textarea'); +},{"./Textarea":124}],126:[function(_dereq_,module,exports){ +module.exports = function requiredIf(type, condition) { + return function(props) { + const test = condition(props) ? type.isRequired : type; + return test.apply(this, arguments); + }; +}; + +},{}],127:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -5476,11 +5895,11 @@ Toggle.propTypes = { module.exports = Toggle; -},{"react":475}],113:[function(_dereq_,module,exports){ +},{"react":496}],128:[function(_dereq_,module,exports){ 'use strict'; module.exports = _dereq_('./Toggle'); -},{"./Toggle":112}],114:[function(_dereq_,module,exports){ +},{"./Toggle":127}],129:[function(_dereq_,module,exports){ 'use strict'; var superagent = _dereq_('superagent'); @@ -5660,11 +6079,11 @@ function del() { } module.exports = { beforeSend: beforeSend, request: request, get: get, post: post, put: put, patch: patch, del: del }; -},{"cf-util-logger":117,"superagent":121}],115:[function(_dereq_,module,exports){ +},{"cf-util-logger":132,"superagent":136}],130:[function(_dereq_,module,exports){ 'use strict'; module.exports = _dereq_('./http'); -},{"./http":114}],116:[function(_dereq_,module,exports){ +},{"./http":129}],131:[function(_dereq_,module,exports){ 'use strict'; var debug = _dereq_('debug'); @@ -5678,11 +6097,11 @@ function createLogger(name) { } module.exports = createLogger; -},{"debug":118}],117:[function(_dereq_,module,exports){ +},{"debug":133}],132:[function(_dereq_,module,exports){ 'use strict'; module.exports = _dereq_('./createLogger'); -},{"./createLogger":116}],118:[function(_dereq_,module,exports){ +},{"./createLogger":131}],133:[function(_dereq_,module,exports){ /** * This is the web browser implementation of `debug()`. @@ -5852,7 +6271,7 @@ function localstorage(){ } catch (e) {} } -},{"./debug":119}],119:[function(_dereq_,module,exports){ +},{"./debug":134}],134:[function(_dereq_,module,exports){ /** * This is the common logic for both the Node.js and web browser @@ -6051,7 +6470,7 @@ function coerce(val) { return val; } -},{"ms":120}],120:[function(_dereq_,module,exports){ +},{"ms":135}],135:[function(_dereq_,module,exports){ /** * Helpers. */ @@ -6178,7 +6597,7 @@ function plural(ms, n, name) { return Math.ceil(ms / n) + ' ' + name + 's'; } -},{}],121:[function(_dereq_,module,exports){ +},{}],136:[function(_dereq_,module,exports){ /** * Module dependencies. */ @@ -7257,7 +7676,7 @@ request.put = function(url, data, fn){ return req; }; -},{"./is-object":122,"./request":124,"./request-base":123,"emitter":125,"reduce":126}],122:[function(_dereq_,module,exports){ +},{"./is-object":137,"./request":139,"./request-base":138,"emitter":140,"reduce":141}],137:[function(_dereq_,module,exports){ /** * Check if `obj` is an object. * @@ -7272,7 +7691,7 @@ function isObject(obj) { module.exports = isObject; -},{}],123:[function(_dereq_,module,exports){ +},{}],138:[function(_dereq_,module,exports){ /** * Module of mixed-in functions shared between node and client code */ @@ -7440,7 +7859,7 @@ exports.field = function(name, val) { return this; }; -},{"./is-object":122}],124:[function(_dereq_,module,exports){ +},{"./is-object":137}],139:[function(_dereq_,module,exports){ // The node and browser modules expose versions of this with the // appropriate constructor function bound as first argument /** @@ -7474,7 +7893,7 @@ function request(RequestConstructor, method, url) { module.exports = request; -},{}],125:[function(_dereq_,module,exports){ +},{}],140:[function(_dereq_,module,exports){ /** * Expose `Emitter`. @@ -7639,7 +8058,7 @@ Emitter.prototype.hasListeners = function(event){ return !! this.listeners(event).length; }; -},{}],126:[function(_dereq_,module,exports){ +},{}],141:[function(_dereq_,module,exports){ /** * Reduce `arr` with `fn`. @@ -7664,7 +8083,7 @@ module.exports = function(arr, fn, initial){ return curr; }; -},{}],127:[function(_dereq_,module,exports){ +},{}],142:[function(_dereq_,module,exports){ /** * Indicates that navigation was caused by a call to history.push. */ @@ -7696,7 +8115,7 @@ exports['default'] = { REPLACE: REPLACE, POP: POP }; -},{}],128:[function(_dereq_,module,exports){ +},{}],143:[function(_dereq_,module,exports){ "use strict"; exports.__esModule = true; @@ -7723,7 +8142,7 @@ function loopAsync(turns, work, callback) { next(); } -},{}],129:[function(_dereq_,module,exports){ +},{}],144:[function(_dereq_,module,exports){ (function (process){ /*eslint-disable no-empty */ 'use strict'; @@ -7795,7 +8214,7 @@ function readState(key) { } }).call(this,_dereq_('_process')) -},{"_process":2,"warning":149}],130:[function(_dereq_,module,exports){ +},{"_process":2,"warning":164}],145:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -7876,13 +8295,13 @@ function supportsGoWithoutReloadUsingHash() { var ua = navigator.userAgent; return ua.indexOf('Firefox') === -1; } -},{}],131:[function(_dereq_,module,exports){ +},{}],146:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); exports.canUseDOM = canUseDOM; -},{}],132:[function(_dereq_,module,exports){ +},{}],147:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -7926,7 +8345,7 @@ exports['default'] = createDOMHistory; module.exports = exports['default']; }).call(this,_dereq_('_process')) -},{"./DOMUtils":130,"./ExecutionEnvironment":131,"./createHistory":134,"_process":2,"invariant":146}],133:[function(_dereq_,module,exports){ +},{"./DOMUtils":145,"./ExecutionEnvironment":146,"./createHistory":149,"_process":2,"invariant":161}],148:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -8178,7 +8597,7 @@ exports['default'] = createHashHistory; module.exports = exports['default']; }).call(this,_dereq_('_process')) -},{"./Actions":127,"./DOMStateStorage":129,"./DOMUtils":130,"./ExecutionEnvironment":131,"./createDOMHistory":132,"./parsePath":139,"_process":2,"invariant":146,"warning":149}],134:[function(_dereq_,module,exports){ +},{"./Actions":142,"./DOMStateStorage":144,"./DOMUtils":145,"./ExecutionEnvironment":146,"./createDOMHistory":147,"./parsePath":154,"_process":2,"invariant":161,"warning":164}],149:[function(_dereq_,module,exports){ //import warning from 'warning' 'use strict'; @@ -8470,7 +8889,7 @@ function createHistory() { exports['default'] = createHistory; module.exports = exports['default']; -},{"./Actions":127,"./AsyncUtils":128,"./createLocation":135,"./deprecate":137,"./parsePath":139,"./runTransitionHook":140,"deep-equal":143}],135:[function(_dereq_,module,exports){ +},{"./Actions":142,"./AsyncUtils":143,"./createLocation":150,"./deprecate":152,"./parsePath":154,"./runTransitionHook":155,"deep-equal":158}],150:[function(_dereq_,module,exports){ //import warning from 'warning' 'use strict'; @@ -8525,7 +8944,7 @@ function createLocation() { exports['default'] = createLocation; module.exports = exports['default']; -},{"./Actions":127,"./parsePath":139}],136:[function(_dereq_,module,exports){ +},{"./Actions":142,"./parsePath":154}],151:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -8684,7 +9103,7 @@ exports['default'] = createMemoryHistory; module.exports = exports['default']; }).call(this,_dereq_('_process')) -},{"./Actions":127,"./createHistory":134,"./parsePath":139,"_process":2,"invariant":146,"warning":149}],137:[function(_dereq_,module,exports){ +},{"./Actions":142,"./createHistory":149,"./parsePath":154,"_process":2,"invariant":161,"warning":164}],152:[function(_dereq_,module,exports){ //import warning from 'warning' "use strict"; @@ -8700,7 +9119,7 @@ function deprecate(fn) { exports["default"] = deprecate; module.exports = exports["default"]; -},{}],138:[function(_dereq_,module,exports){ +},{}],153:[function(_dereq_,module,exports){ "use strict"; exports.__esModule = true; @@ -8714,7 +9133,7 @@ function extractPath(string) { exports["default"] = extractPath; module.exports = exports["default"]; -},{}],139:[function(_dereq_,module,exports){ +},{}],154:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -8762,7 +9181,7 @@ exports['default'] = parsePath; module.exports = exports['default']; }).call(this,_dereq_('_process')) -},{"./extractPath":138,"_process":2,"warning":149}],140:[function(_dereq_,module,exports){ +},{"./extractPath":153,"_process":2,"warning":164}],155:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -8790,7 +9209,7 @@ exports['default'] = runTransitionHook; module.exports = exports['default']; }).call(this,_dereq_('_process')) -},{"_process":2,"warning":149}],141:[function(_dereq_,module,exports){ +},{"_process":2,"warning":164}],156:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -8931,7 +9350,7 @@ function useBasename(createHistory) { exports['default'] = useBasename; module.exports = exports['default']; -},{"./ExecutionEnvironment":131,"./deprecate":137,"./extractPath":138,"./parsePath":139,"./runTransitionHook":140}],142:[function(_dereq_,module,exports){ +},{"./ExecutionEnvironment":146,"./deprecate":152,"./extractPath":153,"./parsePath":154,"./runTransitionHook":155}],157:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -9107,7 +9526,7 @@ exports['default'] = useQueries; module.exports = exports['default']; }).call(this,_dereq_('_process')) -},{"./deprecate":137,"./parsePath":139,"./runTransitionHook":140,"_process":2,"query-string":147,"warning":149}],143:[function(_dereq_,module,exports){ +},{"./deprecate":152,"./parsePath":154,"./runTransitionHook":155,"_process":2,"query-string":162,"warning":164}],158:[function(_dereq_,module,exports){ var pSlice = Array.prototype.slice; var objectKeys = _dereq_('./lib/keys.js'); var isArguments = _dereq_('./lib/is_arguments.js'); @@ -9203,7 +9622,7 @@ function objEquiv(a, b, opts) { return typeof a === typeof b; } -},{"./lib/is_arguments.js":144,"./lib/keys.js":145}],144:[function(_dereq_,module,exports){ +},{"./lib/is_arguments.js":159,"./lib/keys.js":160}],159:[function(_dereq_,module,exports){ var supportsArgumentsClass = (function(){ return Object.prototype.toString.call(arguments) })() == '[object Arguments]'; @@ -9225,7 +9644,7 @@ function unsupported(object){ false; }; -},{}],145:[function(_dereq_,module,exports){ +},{}],160:[function(_dereq_,module,exports){ exports = module.exports = typeof Object.keys === 'function' ? Object.keys : shim; @@ -9236,7 +9655,7 @@ function shim (obj) { return keys; } -},{}],146:[function(_dereq_,module,exports){ +},{}],161:[function(_dereq_,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -9292,7 +9711,7 @@ module.exports = invariant; }).call(this,_dereq_('_process')) -},{"_process":2}],147:[function(_dereq_,module,exports){ +},{"_process":2}],162:[function(_dereq_,module,exports){ 'use strict'; var strictUriEncode = _dereq_('strict-uri-encode'); @@ -9360,7 +9779,7 @@ exports.stringify = function (obj) { }).join('&') : ''; }; -},{"strict-uri-encode":148}],148:[function(_dereq_,module,exports){ +},{"strict-uri-encode":163}],163:[function(_dereq_,module,exports){ 'use strict'; module.exports = function (str) { return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { @@ -9368,7 +9787,7 @@ module.exports = function (str) { }); }; -},{}],149:[function(_dereq_,module,exports){ +},{}],164:[function(_dereq_,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -9433,7 +9852,7 @@ module.exports = warning; }).call(this,_dereq_('_process')) -},{"_process":2}],150:[function(_dereq_,module,exports){ +},{"_process":2}],165:[function(_dereq_,module,exports){ (function (global){ // Expose `IntlPolyfill` as global to add locale data into runtime later on. global.IntlPolyfill = _dereq_('./lib/core.js'); @@ -9453,7 +9872,7 @@ module.exports = global.IntlPolyfill; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./lib/core.js":151,"./locale-data/complete.js":1}],151:[function(_dereq_,module,exports){ +},{"./lib/core.js":166,"./locale-data/complete.js":1}],166:[function(_dereq_,module,exports){ 'use strict'; var babelHelpers = {}; @@ -13250,7 +13669,7 @@ function addLocaleData(data, tag) { } module.exports = Intl; -},{}],152:[function(_dereq_,module,exports){ +},{}],167:[function(_dereq_,module,exports){ (function (global){ /** * @license @@ -25606,7 +26025,7 @@ module.exports = Intl; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],153:[function(_dereq_,module,exports){ +},{}],168:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -25636,6 +26055,7 @@ var EntitySchema = function () { }; this._idAttribute = idAttribute; this._meta = options.meta; + this._defaults = options.defaults; } _createClass(EntitySchema, [{ @@ -25666,6 +26086,11 @@ var EntitySchema = function () { } return this._meta && this._meta[prop]; } + }, { + key: 'getDefaults', + value: function getDefaults() { + return this._defaults; + } }, { key: 'define', value: function define(nestedSchema) { @@ -25681,7 +26106,7 @@ var EntitySchema = function () { }(); exports.default = EntitySchema; -},{}],154:[function(_dereq_,module,exports){ +},{}],169:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -25731,7 +26156,7 @@ var ArraySchema = function () { }(); exports.default = ArraySchema; -},{"./UnionSchema":155,"lodash/isObject":230}],155:[function(_dereq_,module,exports){ +},{"./UnionSchema":170,"lodash/isObject":250}],170:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -25784,13 +26209,16 @@ var UnionSchema = function () { }(); exports.default = UnionSchema; -},{"lodash/isObject":230}],156:[function(_dereq_,module,exports){ +},{"lodash/isObject":250}],171:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.Schema = undefined; + +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + exports.arrayOf = arrayOf; exports.valuesOf = valuesOf; exports.unionOf = unionOf; @@ -25827,10 +26255,11 @@ function visitObject(obj, schema, bag, options) { var assignEntity = _options$assignEntity === undefined ? defaultAssignEntity : _options$assignEntity; - var normalized = {}; + var defaults = schema && schema.getDefaults && schema.getDefaults(); + var schemaAssignEntity = schema && schema.getAssignEntity && schema.getAssignEntity(); + var normalized = (0, _isObject2.default)(defaults) ? _extends({}, defaults) : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { - var schemaAssignEntity = schema && schema.getAssignEntity && schema.getAssignEntity(); var entity = visit(obj[key], schema[key], bag, options); assignEntity.call(null, normalized, key, entity, obj, schema); if (schemaAssignEntity) { @@ -25960,7 +26389,7 @@ function normalize(obj, schema) { result: result }; } -},{"./EntitySchema":153,"./IterableSchema":154,"./UnionSchema":155,"lodash/isEqual":227,"lodash/isObject":230}],157:[function(_dereq_,module,exports){ +},{"./EntitySchema":168,"./IterableSchema":169,"./UnionSchema":170,"lodash/isEqual":247,"lodash/isObject":250}],172:[function(_dereq_,module,exports){ var getNative = _dereq_('./_getNative'), root = _dereq_('./_root'); @@ -25969,7 +26398,7 @@ var DataView = getNative(root, 'DataView'); module.exports = DataView; -},{"./_getNative":185,"./_root":212}],158:[function(_dereq_,module,exports){ +},{"./_getNative":203,"./_root":232}],173:[function(_dereq_,module,exports){ var hashClear = _dereq_('./_hashClear'), hashDelete = _dereq_('./_hashDelete'), hashGet = _dereq_('./_hashGet'), @@ -26003,7 +26432,7 @@ Hash.prototype.set = hashSet; module.exports = Hash; -},{"./_hashClear":189,"./_hashDelete":190,"./_hashGet":191,"./_hashHas":192,"./_hashSet":193}],159:[function(_dereq_,module,exports){ +},{"./_hashClear":207,"./_hashDelete":208,"./_hashGet":209,"./_hashHas":210,"./_hashSet":211}],174:[function(_dereq_,module,exports){ var listCacheClear = _dereq_('./_listCacheClear'), listCacheDelete = _dereq_('./_listCacheDelete'), listCacheGet = _dereq_('./_listCacheGet'), @@ -26037,7 +26466,7 @@ ListCache.prototype.set = listCacheSet; module.exports = ListCache; -},{"./_listCacheClear":200,"./_listCacheDelete":201,"./_listCacheGet":202,"./_listCacheHas":203,"./_listCacheSet":204}],160:[function(_dereq_,module,exports){ +},{"./_listCacheClear":218,"./_listCacheDelete":219,"./_listCacheGet":220,"./_listCacheHas":221,"./_listCacheSet":222}],175:[function(_dereq_,module,exports){ var getNative = _dereq_('./_getNative'), root = _dereq_('./_root'); @@ -26046,7 +26475,7 @@ var Map = getNative(root, 'Map'); module.exports = Map; -},{"./_getNative":185,"./_root":212}],161:[function(_dereq_,module,exports){ +},{"./_getNative":203,"./_root":232}],176:[function(_dereq_,module,exports){ var mapCacheClear = _dereq_('./_mapCacheClear'), mapCacheDelete = _dereq_('./_mapCacheDelete'), mapCacheGet = _dereq_('./_mapCacheGet'), @@ -26080,7 +26509,7 @@ MapCache.prototype.set = mapCacheSet; module.exports = MapCache; -},{"./_mapCacheClear":205,"./_mapCacheDelete":206,"./_mapCacheGet":207,"./_mapCacheHas":208,"./_mapCacheSet":209}],162:[function(_dereq_,module,exports){ +},{"./_mapCacheClear":223,"./_mapCacheDelete":224,"./_mapCacheGet":225,"./_mapCacheHas":226,"./_mapCacheSet":227}],177:[function(_dereq_,module,exports){ var getNative = _dereq_('./_getNative'), root = _dereq_('./_root'); @@ -26089,7 +26518,7 @@ var Promise = getNative(root, 'Promise'); module.exports = Promise; -},{"./_getNative":185,"./_root":212}],163:[function(_dereq_,module,exports){ +},{"./_getNative":203,"./_root":232}],178:[function(_dereq_,module,exports){ var getNative = _dereq_('./_getNative'), root = _dereq_('./_root'); @@ -26098,7 +26527,7 @@ var Set = getNative(root, 'Set'); module.exports = Set; -},{"./_getNative":185,"./_root":212}],164:[function(_dereq_,module,exports){ +},{"./_getNative":203,"./_root":232}],179:[function(_dereq_,module,exports){ var MapCache = _dereq_('./_MapCache'), setCacheAdd = _dereq_('./_setCacheAdd'), setCacheHas = _dereq_('./_setCacheHas'); @@ -26127,7 +26556,7 @@ SetCache.prototype.has = setCacheHas; module.exports = SetCache; -},{"./_MapCache":161,"./_setCacheAdd":213,"./_setCacheHas":214}],165:[function(_dereq_,module,exports){ +},{"./_MapCache":176,"./_setCacheAdd":233,"./_setCacheHas":234}],180:[function(_dereq_,module,exports){ var ListCache = _dereq_('./_ListCache'), stackClear = _dereq_('./_stackClear'), stackDelete = _dereq_('./_stackDelete'), @@ -26155,7 +26584,7 @@ Stack.prototype.set = stackSet; module.exports = Stack; -},{"./_ListCache":159,"./_stackClear":216,"./_stackDelete":217,"./_stackGet":218,"./_stackHas":219,"./_stackSet":220}],166:[function(_dereq_,module,exports){ +},{"./_ListCache":174,"./_stackClear":236,"./_stackDelete":237,"./_stackGet":238,"./_stackHas":239,"./_stackSet":240}],181:[function(_dereq_,module,exports){ var root = _dereq_('./_root'); /** Built-in value references. */ @@ -26163,7 +26592,7 @@ var Symbol = root.Symbol; module.exports = Symbol; -},{"./_root":212}],167:[function(_dereq_,module,exports){ +},{"./_root":232}],182:[function(_dereq_,module,exports){ var root = _dereq_('./_root'); /** Built-in value references. */ @@ -26171,7 +26600,7 @@ var Uint8Array = root.Uint8Array; module.exports = Uint8Array; -},{"./_root":212}],168:[function(_dereq_,module,exports){ +},{"./_root":232}],183:[function(_dereq_,module,exports){ var getNative = _dereq_('./_getNative'), root = _dereq_('./_root'); @@ -26180,7 +26609,7 @@ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; -},{"./_getNative":185,"./_root":212}],169:[function(_dereq_,module,exports){ +},{"./_getNative":203,"./_root":232}],184:[function(_dereq_,module,exports){ /** * A specialized version of `_.some` for arrays without support for iteratee * shorthands. @@ -26205,7 +26634,7 @@ function arraySome(array, predicate) { module.exports = arraySome; -},{}],170:[function(_dereq_,module,exports){ +},{}],185:[function(_dereq_,module,exports){ var eq = _dereq_('./eq'); /** @@ -26228,9 +26657,33 @@ function assocIndexOf(array, key) { module.exports = assocIndexOf; -},{"./eq":222}],171:[function(_dereq_,module,exports){ -arguments[4][24][0].apply(exports,arguments) -},{"./_getPrototype":186,"dup":24}],172:[function(_dereq_,module,exports){ +},{"./eq":242}],186:[function(_dereq_,module,exports){ +/** Used for built-in method references. */ +var objectProto = Object.prototype; + +/** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** + * The base implementation of `getTag`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ +function baseGetTag(value) { + return objectToString.call(value); +} + +module.exports = baseGetTag; + +},{}],187:[function(_dereq_,module,exports){ +arguments[4][25][0].apply(exports,arguments) +},{"./_getPrototype":204,"dup":25}],188:[function(_dereq_,module,exports){ var baseIsEqualDeep = _dereq_('./_baseIsEqualDeep'), isObject = _dereq_('./isObject'), isObjectLike = _dereq_('./isObjectLike'); @@ -26262,7 +26715,7 @@ function baseIsEqual(value, other, customizer, bitmask, stack) { module.exports = baseIsEqual; -},{"./_baseIsEqualDeep":173,"./isObject":230,"./isObjectLike":231}],173:[function(_dereq_,module,exports){ +},{"./_baseIsEqualDeep":189,"./isObject":250,"./isObjectLike":251}],189:[function(_dereq_,module,exports){ var Stack = _dereq_('./_Stack'), equalArrays = _dereq_('./_equalArrays'), equalByTag = _dereq_('./_equalByTag'), @@ -26346,7 +26799,7 @@ function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) { module.exports = baseIsEqualDeep; -},{"./_Stack":165,"./_equalArrays":180,"./_equalByTag":181,"./_equalObjects":182,"./_getTag":187,"./_isHostObject":195,"./isArray":224,"./isTypedArray":233}],174:[function(_dereq_,module,exports){ +},{"./_Stack":180,"./_equalArrays":197,"./_equalByTag":198,"./_equalObjects":199,"./_getTag":205,"./_isHostObject":213,"./isArray":244,"./isTypedArray":253}],190:[function(_dereq_,module,exports){ var isFunction = _dereq_('./isFunction'), isHostObject = _dereq_('./_isHostObject'), isMasked = _dereq_('./_isMasked'), @@ -26395,27 +26848,100 @@ function baseIsNative(value) { module.exports = baseIsNative; -},{"./_isHostObject":195,"./_isMasked":198,"./_toSource":221,"./isFunction":228,"./isObject":230}],175:[function(_dereq_,module,exports){ -arguments[4][26][0].apply(exports,arguments) -},{"dup":26}],176:[function(_dereq_,module,exports){ -arguments[4][27][0].apply(exports,arguments) -},{"dup":27}],177:[function(_dereq_,module,exports){ -arguments[4][28][0].apply(exports,arguments) -},{"dup":28}],178:[function(_dereq_,module,exports){ +},{"./_isHostObject":213,"./_isMasked":216,"./_toSource":241,"./isFunction":248,"./isObject":250}],191:[function(_dereq_,module,exports){ +var isLength = _dereq_('./isLength'), + isObjectLike = _dereq_('./isObjectLike'); + +/** `Object#toString` result references. */ +var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + errorTag = '[object Error]', + funcTag = '[object Function]', + mapTag = '[object Map]', + numberTag = '[object Number]', + objectTag = '[object Object]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + weakMapTag = '[object WeakMap]'; + +var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + +/** Used to identify `toStringTag` values of typed arrays. */ +var typedArrayTags = {}; +typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = +typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = +typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = +typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = +typedArrayTags[uint32Tag] = true; +typedArrayTags[argsTag] = typedArrayTags[arrayTag] = +typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = +typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = +typedArrayTags[errorTag] = typedArrayTags[funcTag] = +typedArrayTags[mapTag] = typedArrayTags[numberTag] = +typedArrayTags[objectTag] = typedArrayTags[regexpTag] = +typedArrayTags[setTag] = typedArrayTags[stringTag] = +typedArrayTags[weakMapTag] = false; + +/** Used for built-in method references. */ +var objectProto = Object.prototype; + /** - * Checks if `value` is a global object. + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) + * of values. + */ +var objectToString = objectProto.toString; + +/** + * The base implementation of `_.isTypedArray` without Node.js optimizations. * * @private * @param {*} value The value to check. - * @returns {null|Object} Returns `value` if it's a global object, else `null`. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ +function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; +} + +module.exports = baseIsTypedArray; + +},{"./isLength":249,"./isObjectLike":251}],192:[function(_dereq_,module,exports){ +arguments[4][28][0].apply(exports,arguments) +},{"./_overArg":231,"dup":28}],193:[function(_dereq_,module,exports){ +arguments[4][29][0].apply(exports,arguments) +},{"dup":29}],194:[function(_dereq_,module,exports){ +arguments[4][30][0].apply(exports,arguments) +},{"dup":30}],195:[function(_dereq_,module,exports){ +/** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. */ -function checkGlobal(value) { - return (value && value.Object === Object) ? value : null; +function baseUnary(func) { + return function(value) { + return func(value); + }; } -module.exports = checkGlobal; +module.exports = baseUnary; -},{}],179:[function(_dereq_,module,exports){ +},{}],196:[function(_dereq_,module,exports){ var root = _dereq_('./_root'); /** Used to detect overreaching core-js shims. */ @@ -26423,7 +26949,7 @@ var coreJsData = root['__core-js_shared__']; module.exports = coreJsData; -},{"./_root":212}],180:[function(_dereq_,module,exports){ +},{"./_root":232}],197:[function(_dereq_,module,exports){ var SetCache = _dereq_('./_SetCache'), arraySome = _dereq_('./_arraySome'); @@ -26455,7 +26981,7 @@ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { } // Assume cyclic values are equal. var stacked = stack.get(array); - if (stacked) { + if (stacked && stack.get(other)) { return stacked == other; } var index = -1, @@ -26463,6 +26989,7 @@ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { seen = (bitmask & UNORDERED_COMPARE_FLAG) ? new SetCache : undefined; stack.set(array, other); + stack.set(other, array); // Ignore non-index properties. while (++index < arrLength) { @@ -26501,14 +27028,16 @@ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) { } } stack['delete'](array); + stack['delete'](other); return result; } module.exports = equalArrays; -},{"./_SetCache":164,"./_arraySome":169}],181:[function(_dereq_,module,exports){ +},{"./_SetCache":179,"./_arraySome":184}],198:[function(_dereq_,module,exports){ var Symbol = _dereq_('./_Symbol'), Uint8Array = _dereq_('./_Uint8Array'), + eq = _dereq_('./eq'), equalArrays = _dereq_('./_equalArrays'), mapToArray = _dereq_('./_mapToArray'), setToArray = _dereq_('./_setToArray'); @@ -26572,18 +27101,14 @@ function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { case boolTag: case dateTag: - // Coerce dates and booleans to numbers, dates to milliseconds and - // booleans to `1` or `0` treating invalid dates coerced to `NaN` as - // not equal. - return +object == +other; + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); case errorTag: return object.name == other.name && object.message == other.message; - case numberTag: - // Treat `NaN` vs. `NaN` as equal. - return (object != +object) ? other != +other : object == +other; - case regexpTag: case stringTag: // Coerce regexes to strings and treat strings, primitives and objects, @@ -26607,10 +27132,12 @@ function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { return stacked == other; } bitmask |= UNORDERED_COMPARE_FLAG; - stack.set(object, other); // Recursively compare objects (susceptible to call stack limits). - return equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack); + stack['delete'](object); + return result; case symbolTag: if (symbolValueOf) { @@ -26622,7 +27149,7 @@ function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) { module.exports = equalByTag; -},{"./_Symbol":166,"./_Uint8Array":167,"./_equalArrays":180,"./_mapToArray":210,"./_setToArray":215}],182:[function(_dereq_,module,exports){ +},{"./_Symbol":181,"./_Uint8Array":182,"./_equalArrays":197,"./_mapToArray":228,"./_setToArray":235,"./eq":242}],199:[function(_dereq_,module,exports){ var baseHas = _dereq_('./_baseHas'), keys = _dereq_('./keys'); @@ -26662,11 +27189,12 @@ function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { } // Assume cyclic values are equal. var stacked = stack.get(object); - if (stacked) { + if (stacked && stack.get(other)) { return stacked == other; } var result = true; stack.set(object, other); + stack.set(other, object); var skipCtor = isPartial; while (++index < objLength) { @@ -26702,14 +27230,24 @@ function equalObjects(object, other, equalFunc, customizer, bitmask, stack) { } } stack['delete'](object); + stack['delete'](other); return result; } module.exports = equalObjects; -},{"./_baseHas":171,"./keys":234}],183:[function(_dereq_,module,exports){ -arguments[4][30][0].apply(exports,arguments) -},{"./_baseProperty":176,"dup":30}],184:[function(_dereq_,module,exports){ +},{"./_baseHas":187,"./keys":254}],200:[function(_dereq_,module,exports){ +(function (global){ +/** Detect free variable `global` from Node.js. */ +var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + +module.exports = freeGlobal; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],201:[function(_dereq_,module,exports){ +arguments[4][32][0].apply(exports,arguments) +},{"./_baseProperty":193,"dup":32}],202:[function(_dereq_,module,exports){ var isKeyable = _dereq_('./_isKeyable'); /** @@ -26729,7 +27267,7 @@ function getMapData(map, key) { module.exports = getMapData; -},{"./_isKeyable":197}],185:[function(_dereq_,module,exports){ +},{"./_isKeyable":215}],203:[function(_dereq_,module,exports){ var baseIsNative = _dereq_('./_baseIsNative'), getValue = _dereq_('./_getValue'); @@ -26748,14 +27286,15 @@ function getNative(object, key) { module.exports = getNative; -},{"./_baseIsNative":174,"./_getValue":188}],186:[function(_dereq_,module,exports){ -arguments[4][31][0].apply(exports,arguments) -},{"dup":31}],187:[function(_dereq_,module,exports){ +},{"./_baseIsNative":190,"./_getValue":206}],204:[function(_dereq_,module,exports){ +arguments[4][33][0].apply(exports,arguments) +},{"./_overArg":231,"dup":33}],205:[function(_dereq_,module,exports){ var DataView = _dereq_('./_DataView'), Map = _dereq_('./_Map'), Promise = _dereq_('./_Promise'), Set = _dereq_('./_Set'), WeakMap = _dereq_('./_WeakMap'), + baseGetTag = _dereq_('./_baseGetTag'), toSource = _dereq_('./_toSource'); /** `Object#toString` result references. */ @@ -26791,9 +27330,7 @@ var dataViewCtorString = toSource(DataView), * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ -function getTag(value) { - return objectToString.call(value); -} +var getTag = baseGetTag; // Fallback for data views, maps, sets, and weak maps in IE 11, // for data views in Edge, and promises in Node.js. @@ -26822,7 +27359,7 @@ if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || module.exports = getTag; -},{"./_DataView":157,"./_Map":160,"./_Promise":162,"./_Set":163,"./_WeakMap":168,"./_toSource":221}],188:[function(_dereq_,module,exports){ +},{"./_DataView":172,"./_Map":175,"./_Promise":177,"./_Set":178,"./_WeakMap":183,"./_baseGetTag":186,"./_toSource":241}],206:[function(_dereq_,module,exports){ /** * Gets the value at `key` of `object`. * @@ -26837,7 +27374,7 @@ function getValue(object, key) { module.exports = getValue; -},{}],189:[function(_dereq_,module,exports){ +},{}],207:[function(_dereq_,module,exports){ var nativeCreate = _dereq_('./_nativeCreate'); /** @@ -26853,7 +27390,7 @@ function hashClear() { module.exports = hashClear; -},{"./_nativeCreate":211}],190:[function(_dereq_,module,exports){ +},{"./_nativeCreate":229}],208:[function(_dereq_,module,exports){ /** * Removes `key` and its value from the hash. * @@ -26870,7 +27407,7 @@ function hashDelete(key) { module.exports = hashDelete; -},{}],191:[function(_dereq_,module,exports){ +},{}],209:[function(_dereq_,module,exports){ var nativeCreate = _dereq_('./_nativeCreate'); /** Used to stand-in for `undefined` hash values. */ @@ -26902,7 +27439,7 @@ function hashGet(key) { module.exports = hashGet; -},{"./_nativeCreate":211}],192:[function(_dereq_,module,exports){ +},{"./_nativeCreate":229}],210:[function(_dereq_,module,exports){ var nativeCreate = _dereq_('./_nativeCreate'); /** Used for built-in method references. */ @@ -26927,7 +27464,7 @@ function hashHas(key) { module.exports = hashHas; -},{"./_nativeCreate":211}],193:[function(_dereq_,module,exports){ +},{"./_nativeCreate":229}],211:[function(_dereq_,module,exports){ var nativeCreate = _dereq_('./_nativeCreate'); /** Used to stand-in for `undefined` hash values. */ @@ -26951,9 +27488,9 @@ function hashSet(key, value) { module.exports = hashSet; -},{"./_nativeCreate":211}],194:[function(_dereq_,module,exports){ -arguments[4][32][0].apply(exports,arguments) -},{"./_baseTimes":177,"./isArguments":223,"./isArray":224,"./isLength":229,"./isString":232,"dup":32}],195:[function(_dereq_,module,exports){ +},{"./_nativeCreate":229}],212:[function(_dereq_,module,exports){ +arguments[4][34][0].apply(exports,arguments) +},{"./_baseTimes":194,"./isArguments":243,"./isArray":244,"./isLength":249,"./isString":252,"dup":34}],213:[function(_dereq_,module,exports){ /** * Checks if `value` is a host object in IE < 9. * @@ -26975,9 +27512,9 @@ function isHostObject(value) { module.exports = isHostObject; -},{}],196:[function(_dereq_,module,exports){ -arguments[4][34][0].apply(exports,arguments) -},{"dup":34}],197:[function(_dereq_,module,exports){ +},{}],214:[function(_dereq_,module,exports){ +arguments[4][35][0].apply(exports,arguments) +},{"dup":35}],215:[function(_dereq_,module,exports){ /** * Checks if `value` is suitable for use as unique object key. * @@ -26994,7 +27531,7 @@ function isKeyable(value) { module.exports = isKeyable; -},{}],198:[function(_dereq_,module,exports){ +},{}],216:[function(_dereq_,module,exports){ var coreJsData = _dereq_('./_coreJsData'); /** Used to detect methods masquerading as native. */ @@ -27016,9 +27553,9 @@ function isMasked(func) { module.exports = isMasked; -},{"./_coreJsData":179}],199:[function(_dereq_,module,exports){ -arguments[4][35][0].apply(exports,arguments) -},{"dup":35}],200:[function(_dereq_,module,exports){ +},{"./_coreJsData":196}],217:[function(_dereq_,module,exports){ +arguments[4][36][0].apply(exports,arguments) +},{"dup":36}],218:[function(_dereq_,module,exports){ /** * Removes all key-value entries from the list cache. * @@ -27032,7 +27569,7 @@ function listCacheClear() { module.exports = listCacheClear; -},{}],201:[function(_dereq_,module,exports){ +},{}],219:[function(_dereq_,module,exports){ var assocIndexOf = _dereq_('./_assocIndexOf'); /** Used for built-in method references. */ @@ -27068,7 +27605,7 @@ function listCacheDelete(key) { module.exports = listCacheDelete; -},{"./_assocIndexOf":170}],202:[function(_dereq_,module,exports){ +},{"./_assocIndexOf":185}],220:[function(_dereq_,module,exports){ var assocIndexOf = _dereq_('./_assocIndexOf'); /** @@ -27089,7 +27626,7 @@ function listCacheGet(key) { module.exports = listCacheGet; -},{"./_assocIndexOf":170}],203:[function(_dereq_,module,exports){ +},{"./_assocIndexOf":185}],221:[function(_dereq_,module,exports){ var assocIndexOf = _dereq_('./_assocIndexOf'); /** @@ -27107,7 +27644,7 @@ function listCacheHas(key) { module.exports = listCacheHas; -},{"./_assocIndexOf":170}],204:[function(_dereq_,module,exports){ +},{"./_assocIndexOf":185}],222:[function(_dereq_,module,exports){ var assocIndexOf = _dereq_('./_assocIndexOf'); /** @@ -27134,7 +27671,7 @@ function listCacheSet(key, value) { module.exports = listCacheSet; -},{"./_assocIndexOf":170}],205:[function(_dereq_,module,exports){ +},{"./_assocIndexOf":185}],223:[function(_dereq_,module,exports){ var Hash = _dereq_('./_Hash'), ListCache = _dereq_('./_ListCache'), Map = _dereq_('./_Map'); @@ -27156,7 +27693,7 @@ function mapCacheClear() { module.exports = mapCacheClear; -},{"./_Hash":158,"./_ListCache":159,"./_Map":160}],206:[function(_dereq_,module,exports){ +},{"./_Hash":173,"./_ListCache":174,"./_Map":175}],224:[function(_dereq_,module,exports){ var getMapData = _dereq_('./_getMapData'); /** @@ -27174,7 +27711,7 @@ function mapCacheDelete(key) { module.exports = mapCacheDelete; -},{"./_getMapData":184}],207:[function(_dereq_,module,exports){ +},{"./_getMapData":202}],225:[function(_dereq_,module,exports){ var getMapData = _dereq_('./_getMapData'); /** @@ -27192,7 +27729,7 @@ function mapCacheGet(key) { module.exports = mapCacheGet; -},{"./_getMapData":184}],208:[function(_dereq_,module,exports){ +},{"./_getMapData":202}],226:[function(_dereq_,module,exports){ var getMapData = _dereq_('./_getMapData'); /** @@ -27210,7 +27747,7 @@ function mapCacheHas(key) { module.exports = mapCacheHas; -},{"./_getMapData":184}],209:[function(_dereq_,module,exports){ +},{"./_getMapData":202}],227:[function(_dereq_,module,exports){ var getMapData = _dereq_('./_getMapData'); /** @@ -27230,7 +27767,7 @@ function mapCacheSet(key, value) { module.exports = mapCacheSet; -},{"./_getMapData":184}],210:[function(_dereq_,module,exports){ +},{"./_getMapData":202}],228:[function(_dereq_,module,exports){ /** * Converts `map` to its key-value pairs. * @@ -27250,7 +27787,7 @@ function mapToArray(map) { module.exports = mapToArray; -},{}],211:[function(_dereq_,module,exports){ +},{}],229:[function(_dereq_,module,exports){ var getNative = _dereq_('./_getNative'); /* Built-in method references that are verified to be native. */ @@ -27258,27 +27795,44 @@ var nativeCreate = getNative(Object, 'create'); module.exports = nativeCreate; -},{"./_getNative":185}],212:[function(_dereq_,module,exports){ -(function (global){ -var checkGlobal = _dereq_('./_checkGlobal'); +},{"./_getNative":203}],230:[function(_dereq_,module,exports){ +var freeGlobal = _dereq_('./_freeGlobal'); -/** Detect free variable `global` from Node.js. */ -var freeGlobal = checkGlobal(typeof global == 'object' && global); +/** Detect free variable `exports`. */ +var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; -/** Detect free variable `self`. */ -var freeSelf = checkGlobal(typeof self == 'object' && self); +/** Detect free variable `module`. */ +var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + +/** Detect the popular CommonJS extension `module.exports`. */ +var moduleExports = freeModule && freeModule.exports === freeExports; + +/** Detect free variable `process` from Node.js. */ +var freeProcess = moduleExports && freeGlobal.process; + +/** Used to access faster Node.js helpers. */ +var nodeUtil = (function() { + try { + return freeProcess && freeProcess.binding('util'); + } catch (e) {} +}()); + +module.exports = nodeUtil; -/** Detect `this` as the global object. */ -var thisGlobal = checkGlobal(typeof this == 'object' && this); +},{"./_freeGlobal":200}],231:[function(_dereq_,module,exports){ +arguments[4][37][0].apply(exports,arguments) +},{"dup":37}],232:[function(_dereq_,module,exports){ +var freeGlobal = _dereq_('./_freeGlobal'); + +/** Detect free variable `self`. */ +var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || thisGlobal || Function('return this')(); +var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{"./_checkGlobal":178}],213:[function(_dereq_,module,exports){ +},{"./_freeGlobal":200}],233:[function(_dereq_,module,exports){ /** Used to stand-in for `undefined` hash values. */ var HASH_UNDEFINED = '__lodash_hash_undefined__'; @@ -27299,7 +27853,7 @@ function setCacheAdd(value) { module.exports = setCacheAdd; -},{}],214:[function(_dereq_,module,exports){ +},{}],234:[function(_dereq_,module,exports){ /** * Checks if `value` is in the array cache. * @@ -27315,7 +27869,7 @@ function setCacheHas(value) { module.exports = setCacheHas; -},{}],215:[function(_dereq_,module,exports){ +},{}],235:[function(_dereq_,module,exports){ /** * Converts `set` to an array of its values. * @@ -27335,7 +27889,7 @@ function setToArray(set) { module.exports = setToArray; -},{}],216:[function(_dereq_,module,exports){ +},{}],236:[function(_dereq_,module,exports){ var ListCache = _dereq_('./_ListCache'); /** @@ -27351,7 +27905,7 @@ function stackClear() { module.exports = stackClear; -},{"./_ListCache":159}],217:[function(_dereq_,module,exports){ +},{"./_ListCache":174}],237:[function(_dereq_,module,exports){ /** * Removes `key` and its value from the stack. * @@ -27367,7 +27921,7 @@ function stackDelete(key) { module.exports = stackDelete; -},{}],218:[function(_dereq_,module,exports){ +},{}],238:[function(_dereq_,module,exports){ /** * Gets the stack value for `key`. * @@ -27383,7 +27937,7 @@ function stackGet(key) { module.exports = stackGet; -},{}],219:[function(_dereq_,module,exports){ +},{}],239:[function(_dereq_,module,exports){ /** * Checks if a stack value for `key` exists. * @@ -27399,8 +27953,9 @@ function stackHas(key) { module.exports = stackHas; -},{}],220:[function(_dereq_,module,exports){ +},{}],240:[function(_dereq_,module,exports){ var ListCache = _dereq_('./_ListCache'), + Map = _dereq_('./_Map'), MapCache = _dereq_('./_MapCache'); /** Used as the size to enable large array optimizations. */ @@ -27418,8 +27973,13 @@ var LARGE_ARRAY_SIZE = 200; */ function stackSet(key, value) { var cache = this.__data__; - if (cache instanceof ListCache && cache.__data__.length == LARGE_ARRAY_SIZE) { - cache = this.__data__ = new MapCache(cache.__data__); + if (cache instanceof ListCache) { + var pairs = cache.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + return this; + } + cache = this.__data__ = new MapCache(pairs); } cache.set(key, value); return this; @@ -27427,7 +27987,7 @@ function stackSet(key, value) { module.exports = stackSet; -},{"./_ListCache":159,"./_MapCache":161}],221:[function(_dereq_,module,exports){ +},{"./_ListCache":174,"./_Map":175,"./_MapCache":176}],241:[function(_dereq_,module,exports){ /** Used to resolve the decompiled source of functions. */ var funcToString = Function.prototype.toString; @@ -27452,7 +28012,7 @@ function toSource(func) { module.exports = toSource; -},{}],222:[function(_dereq_,module,exports){ +},{}],242:[function(_dereq_,module,exports){ /** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero) @@ -27467,8 +28027,8 @@ module.exports = toSource; * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * - * var object = { 'user': 'fred' }; - * var other = { 'user': 'fred' }; + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; * * _.eq(object, object); * // => true @@ -27491,15 +28051,15 @@ function eq(value, other) { module.exports = eq; -},{}],223:[function(_dereq_,module,exports){ -arguments[4][37][0].apply(exports,arguments) -},{"./isArrayLikeObject":226,"dup":37}],224:[function(_dereq_,module,exports){ -arguments[4][38][0].apply(exports,arguments) -},{"dup":38}],225:[function(_dereq_,module,exports){ +},{}],243:[function(_dereq_,module,exports){ arguments[4][39][0].apply(exports,arguments) -},{"./_getLength":183,"./isFunction":228,"./isLength":229,"dup":39}],226:[function(_dereq_,module,exports){ +},{"./isArrayLikeObject":246,"dup":39}],244:[function(_dereq_,module,exports){ arguments[4][40][0].apply(exports,arguments) -},{"./isArrayLike":225,"./isObjectLike":231,"dup":40}],227:[function(_dereq_,module,exports){ +},{"dup":40}],245:[function(_dereq_,module,exports){ +arguments[4][41][0].apply(exports,arguments) +},{"./_getLength":201,"./isFunction":248,"./isLength":249,"dup":41}],246:[function(_dereq_,module,exports){ +arguments[4][42][0].apply(exports,arguments) +},{"./isArrayLike":245,"./isObjectLike":251,"dup":42}],247:[function(_dereq_,module,exports){ var baseIsEqual = _dereq_('./_baseIsEqual'); /** @@ -27522,8 +28082,8 @@ var baseIsEqual = _dereq_('./_baseIsEqual'); * else `false`. * @example * - * var object = { 'user': 'fred' }; - * var other = { 'user': 'fred' }; + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; * * _.isEqual(object, other); * // => true @@ -27537,72 +28097,23 @@ function isEqual(value, other) { module.exports = isEqual; -},{"./_baseIsEqual":172}],228:[function(_dereq_,module,exports){ -arguments[4][41][0].apply(exports,arguments) -},{"./isObject":230,"dup":41}],229:[function(_dereq_,module,exports){ -arguments[4][42][0].apply(exports,arguments) -},{"dup":42}],230:[function(_dereq_,module,exports){ +},{"./_baseIsEqual":188}],248:[function(_dereq_,module,exports){ arguments[4][43][0].apply(exports,arguments) -},{"dup":43}],231:[function(_dereq_,module,exports){ +},{"./isObject":250,"dup":43}],249:[function(_dereq_,module,exports){ arguments[4][44][0].apply(exports,arguments) -},{"dup":44}],232:[function(_dereq_,module,exports){ +},{"dup":44}],250:[function(_dereq_,module,exports){ arguments[4][45][0].apply(exports,arguments) -},{"./isArray":224,"./isObjectLike":231,"dup":45}],233:[function(_dereq_,module,exports){ -var isLength = _dereq_('./isLength'), - isObjectLike = _dereq_('./isObjectLike'); - -/** `Object#toString` result references. */ -var argsTag = '[object Arguments]', - arrayTag = '[object Array]', - boolTag = '[object Boolean]', - dateTag = '[object Date]', - errorTag = '[object Error]', - funcTag = '[object Function]', - mapTag = '[object Map]', - numberTag = '[object Number]', - objectTag = '[object Object]', - regexpTag = '[object RegExp]', - setTag = '[object Set]', - stringTag = '[object String]', - weakMapTag = '[object WeakMap]'; - -var arrayBufferTag = '[object ArrayBuffer]', - dataViewTag = '[object DataView]', - float32Tag = '[object Float32Array]', - float64Tag = '[object Float64Array]', - int8Tag = '[object Int8Array]', - int16Tag = '[object Int16Array]', - int32Tag = '[object Int32Array]', - uint8Tag = '[object Uint8Array]', - uint8ClampedTag = '[object Uint8ClampedArray]', - uint16Tag = '[object Uint16Array]', - uint32Tag = '[object Uint32Array]'; - -/** Used to identify `toStringTag` values of typed arrays. */ -var typedArrayTags = {}; -typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = -typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = -typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = -typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = -typedArrayTags[uint32Tag] = true; -typedArrayTags[argsTag] = typedArrayTags[arrayTag] = -typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = -typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = -typedArrayTags[errorTag] = typedArrayTags[funcTag] = -typedArrayTags[mapTag] = typedArrayTags[numberTag] = -typedArrayTags[objectTag] = typedArrayTags[regexpTag] = -typedArrayTags[setTag] = typedArrayTags[stringTag] = -typedArrayTags[weakMapTag] = false; +},{"dup":45}],251:[function(_dereq_,module,exports){ +arguments[4][46][0].apply(exports,arguments) +},{"dup":46}],252:[function(_dereq_,module,exports){ +arguments[4][47][0].apply(exports,arguments) +},{"./isArray":244,"./isObjectLike":251,"dup":47}],253:[function(_dereq_,module,exports){ +var baseIsTypedArray = _dereq_('./_baseIsTypedArray'), + baseUnary = _dereq_('./_baseUnary'), + nodeUtil = _dereq_('./_nodeUtil'); -/** Used for built-in method references. */ -var objectProto = Object.prototype; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) - * of values. - */ -var objectToString = objectProto.toString; +/* Node.js helper references. */ +var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; /** * Checks if `value` is classified as a typed array. @@ -27612,8 +28123,7 @@ var objectToString = objectProto.toString; * @since 3.0.0 * @category Lang * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is correctly classified, - * else `false`. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. * @example * * _.isTypedArray(new Uint8Array); @@ -27622,18 +28132,15 @@ var objectToString = objectProto.toString; * _.isTypedArray([]); * // => false */ -function isTypedArray(value) { - return isObjectLike(value) && - isLength(value.length) && !!typedArrayTags[objectToString.call(value)]; -} +var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; module.exports = isTypedArray; -},{"./isLength":229,"./isObjectLike":231}],234:[function(_dereq_,module,exports){ -arguments[4][47][0].apply(exports,arguments) -},{"./_baseHas":171,"./_baseKeys":175,"./_indexKeys":194,"./_isIndex":196,"./_isPrototype":199,"./isArrayLike":225,"dup":47}],235:[function(_dereq_,module,exports){ +},{"./_baseIsTypedArray":191,"./_baseUnary":195,"./_nodeUtil":230}],254:[function(_dereq_,module,exports){ +arguments[4][49][0].apply(exports,arguments) +},{"./_baseHas":187,"./_baseKeys":192,"./_indexKeys":212,"./_isIndex":214,"./_isPrototype":217,"./isArrayLike":245,"dup":49}],255:[function(_dereq_,module,exports){ module.exports = _dereq_('react/lib/ReactCSSTransitionGroup'); -},{"react/lib/ReactCSSTransitionGroup":340}],236:[function(_dereq_,module,exports){ +},{"react/lib/ReactCSSTransitionGroup":361}],256:[function(_dereq_,module,exports){ 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -27690,7 +28197,7 @@ C3Wrapper.propTypes = { }; module.exports = C3Wrapper; -},{"c3":237,"react":475}],237:[function(_dereq_,module,exports){ +},{"c3":257,"react":496}],257:[function(_dereq_,module,exports){ (function (window) { 'use strict'; @@ -35894,7 +36401,7 @@ module.exports = C3Wrapper; })(window); -},{"d3":238}],238:[function(_dereq_,module,exports){ +},{"d3":258}],258:[function(_dereq_,module,exports){ !function() { var d3 = { version: "3.5.17" @@ -45449,12 +45956,12 @@ module.exports = C3Wrapper; }); if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3; }(); -},{}],239:[function(_dereq_,module,exports){ +},{}],259:[function(_dereq_,module,exports){ 'use strict'; module.exports = _dereq_('react/lib/ReactDOM'); -},{"react/lib/ReactDOM":350}],240:[function(_dereq_,module,exports){ +},{"react/lib/ReactDOM":371}],260:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45475,7 +45982,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var Gateway = (function (_React$Component) { +var Gateway = function (_React$Component) { _inherits(Gateway, _React$Component); function Gateway(props, context) { @@ -45501,7 +46008,6 @@ var Gateway = (function (_React$Component) { }; Gateway.prototype.renderIntoGatewayNode = function renderIntoGatewayNode(props) { - delete props.ref; this.gatewayRegistry.addChild(this.props.into, props.children); }; @@ -45510,7 +46016,7 @@ var Gateway = (function (_React$Component) { }; return Gateway; -})(_react2.default.Component); +}(_react2.default.Component); Gateway.contextTypes = { gatewayRegistry: _react2.default.PropTypes.instanceOf(_GatewayRegistry2.default).isRequired @@ -45520,7 +46026,7 @@ Gateway.propTypes = { children: _react2.default.PropTypes.oneOfType([_react2.default.PropTypes.element, _react2.default.PropTypes.string]) }; exports.default = Gateway; -},{"./GatewayRegistry":243,"react":475}],241:[function(_dereq_,module,exports){ +},{"./GatewayRegistry":263,"react":496}],261:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45545,7 +46051,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var GatewayDest = (function (_React$Component) { +var GatewayDest = function (_React$Component) { _inherits(GatewayDest, _React$Component); function GatewayDest(props, context) { @@ -45581,7 +46087,7 @@ var GatewayDest = (function (_React$Component) { }; return GatewayDest; -})(_react2.default.Component); +}(_react2.default.Component); GatewayDest.contextTypes = { gatewayRegistry: _react2.default.PropTypes.instanceOf(_GatewayRegistry2.default).isRequired @@ -45592,7 +46098,7 @@ GatewayDest.propTypes = { component: _react2.default.PropTypes.oneOfType([_react2.default.PropTypes.string, _react2.default.PropTypes.func]) }; exports.default = GatewayDest; -},{"./GatewayRegistry":243,"react":475,"react-prop-types":249}],242:[function(_dereq_,module,exports){ +},{"./GatewayRegistry":263,"react":496,"react-prop-types":269}],262:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45613,7 +46119,7 @@ function _possibleConstructorReturn(self, call) { if (!self) { throw new Referen function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } -var GatewayProvider = (function (_React$Component) { +var GatewayProvider = function (_React$Component) { _inherits(GatewayProvider, _React$Component); GatewayProvider.prototype.getChildContext = function getChildContext() { @@ -45636,7 +46142,7 @@ var GatewayProvider = (function (_React$Component) { }; return GatewayProvider; -})(_react2.default.Component); +}(_react2.default.Component); GatewayProvider.childContextTypes = { gatewayRegistry: _react2.default.PropTypes.instanceOf(_GatewayRegistry2.default).isRequired @@ -45645,14 +46151,14 @@ GatewayProvider.propTypes = { children: _react2.default.PropTypes.element }; exports.default = GatewayProvider; -},{"./GatewayRegistry":243,"react":475}],243:[function(_dereq_,module,exports){ +},{"./GatewayRegistry":263,"react":496}],263:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } -var GatewayRegistry = (function () { +var GatewayRegistry = function () { function GatewayRegistry() { _classCallCheck(this, GatewayRegistry); @@ -45697,10 +46203,10 @@ var GatewayRegistry = (function () { }; return GatewayRegistry; -})(); +}(); exports.default = GatewayRegistry; -},{}],244:[function(_dereq_,module,exports){ +},{}],264:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45723,7 +46229,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.Gateway = _Gateway3.default; exports.GatewayDest = _GatewayDest3.default; exports.GatewayProvider = _GatewayProvider3.default; -},{"./Gateway":240,"./GatewayDest":241,"./GatewayProvider":242}],245:[function(_dereq_,module,exports){ +},{"./Gateway":260,"./GatewayDest":261,"./GatewayProvider":262}],265:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45764,7 +46270,7 @@ function all() { } module.exports = exports['default']; -},{"./common":246}],246:[function(_dereq_,module,exports){ +},{"./common":266}],266:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45799,7 +46305,7 @@ function createChainableTypeChecker(validate) { return chainedCheckType; } -},{}],247:[function(_dereq_,module,exports){ +},{}],267:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45833,7 +46339,7 @@ function _resetWarned() { deprecated._resetWarned = _resetWarned; module.exports = exports['default']; -},{"warning":254}],248:[function(_dereq_,module,exports){ +},{"warning":274}],268:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45875,7 +46381,7 @@ function validate(props, propName, componentName) { exports['default'] = _common.createChainableTypeChecker(validate); module.exports = exports['default']; -},{"./common":246,"react":475}],249:[function(_dereq_,module,exports){ +},{"./common":266,"react":496}],269:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45923,7 +46429,7 @@ var _deprecated2 = _dereq_('./deprecated'); var _deprecated3 = _interopRequireDefault(_deprecated2); exports.deprecated = _deprecated3['default']; -},{"./all":245,"./deprecated":247,"./elementType":248,"./isRequiredForA11y":250,"./keyOf":251,"./mountable":252,"./singlePropFrom":253}],250:[function(_dereq_,module,exports){ +},{"./all":265,"./deprecated":267,"./elementType":268,"./isRequiredForA11y":270,"./keyOf":271,"./mountable":272,"./singlePropFrom":273}],270:[function(_dereq_,module,exports){ "use strict"; exports.__esModule = true; @@ -45940,7 +46446,7 @@ function isRequiredForA11y(propType) { } module.exports = exports["default"]; -},{}],251:[function(_dereq_,module,exports){ +},{}],271:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45969,7 +46475,7 @@ function keyOf(obj) { } module.exports = exports['default']; -},{"./common":246}],252:[function(_dereq_,module,exports){ +},{"./common":266}],272:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -45997,7 +46503,7 @@ function validate(props, propName, componentName) { exports['default'] = _common.createChainableTypeChecker(validate); module.exports = exports['default']; -},{"./common":246}],253:[function(_dereq_,module,exports){ +},{"./common":266}],273:[function(_dereq_,module,exports){ /** * Checks if only one of the listed properties is in use. An error is given * if multiple have a value @@ -46036,7 +46542,7 @@ function createSinglePropFromChecker() { } module.exports = exports['default']; -},{}],254:[function(_dereq_,module,exports){ +},{}],274:[function(_dereq_,module,exports){ (function (process){ /** * Copyright 2014-2015, Facebook, Inc. @@ -46101,8 +46607,8 @@ module.exports = warning; }).call(this,_dereq_('_process')) -},{"_process":2}],255:[function(_dereq_,module,exports){ -(function (process){ +},{"_process":2}],275:[function(_dereq_,module,exports){ +(function (process,global){ /* * Copyright 2016, Yahoo Inc. * Copyrights licensed under the New BSD License. @@ -46111,6 +46617,8 @@ module.exports = warning; 'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); + function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } var allLocaleData = _interopDefault(_dereq_('../locale-data/index.js')); @@ -46121,20 +46629,133 @@ var React__default = _interopDefault(React); var invariant = _interopDefault(_dereq_('invariant')); var memoizeIntlConstructor = _interopDefault(_dereq_('intl-format-cache')); -var babelHelpers = {}; -babelHelpers.typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { +// GENERATED FILE +var defaultLocaleData = { "locale": "en", "pluralRuleFunction": function pluralRuleFunction(n, ord) { + var s = String(n).split("."), + v0 = !s[1], + t0 = Number(s[0]) == n, + n10 = t0 && s[0].slice(-1), + n100 = t0 && s[0].slice(-2);if (ord) return n10 == 1 && n100 != 11 ? "one" : n10 == 2 && n100 != 12 ? "two" : n10 == 3 && n100 != 13 ? "few" : "other";return n == 1 && v0 ? "one" : "other"; + }, "fields": { "year": { "displayName": "year", "relative": { "0": "this year", "1": "next year", "-1": "last year" }, "relativeTime": { "future": { "one": "in {0} year", "other": "in {0} years" }, "past": { "one": "{0} year ago", "other": "{0} years ago" } } }, "month": { "displayName": "month", "relative": { "0": "this month", "1": "next month", "-1": "last month" }, "relativeTime": { "future": { "one": "in {0} month", "other": "in {0} months" }, "past": { "one": "{0} month ago", "other": "{0} months ago" } } }, "day": { "displayName": "day", "relative": { "0": "today", "1": "tomorrow", "-1": "yesterday" }, "relativeTime": { "future": { "one": "in {0} day", "other": "in {0} days" }, "past": { "one": "{0} day ago", "other": "{0} days ago" } } }, "hour": { "displayName": "hour", "relativeTime": { "future": { "one": "in {0} hour", "other": "in {0} hours" }, "past": { "one": "{0} hour ago", "other": "{0} hours ago" } } }, "minute": { "displayName": "minute", "relativeTime": { "future": { "one": "in {0} minute", "other": "in {0} minutes" }, "past": { "one": "{0} minute ago", "other": "{0} minutes ago" } } }, "second": { "displayName": "second", "relative": { "0": "now" }, "relativeTime": { "future": { "one": "in {0} second", "other": "in {0} seconds" }, "past": { "one": "{0} second ago", "other": "{0} seconds ago" } } } } }; + +function addLocaleData() { + var data = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + + var locales = Array.isArray(data) ? data : [data]; + + locales.forEach(function (localeData) { + if (localeData && localeData.locale) { + IntlMessageFormat.__addLocaleData(localeData); + IntlRelativeFormat.__addLocaleData(localeData); + } + }); +} + +function hasLocaleData(locale) { + var localeParts = (locale || '').split('-'); + + while (localeParts.length > 0) { + if (hasIMFAndIRFLocaleData(localeParts.join('-'))) { + return true; + } + + localeParts.pop(); + } + + return false; +} + +function hasIMFAndIRFLocaleData(locale) { + var normalizedLocale = locale && locale.toLowerCase(); + + return !!(IntlMessageFormat.__localeData__[normalizedLocale] && IntlRelativeFormat.__localeData__[normalizedLocale]); +} + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; -babelHelpers.classCallCheck = function (instance, Constructor) { +var jsx = function () { + var REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 0xeac7; + return function createRawReactElement(type, props, key, children) { + var defaultProps = type && type.defaultProps; + var childrenLength = arguments.length - 3; + + if (!props && childrenLength !== 0) { + props = {}; + } + + if (props && defaultProps) { + for (var propName in defaultProps) { + if (props[propName] === void 0) { + props[propName] = defaultProps[propName]; + } + } + } else if (!props) { + props = defaultProps || {}; + } + + if (childrenLength === 1) { + props.children = children; + } else if (childrenLength > 1) { + var childArray = Array(childrenLength); + + for (var i = 0; i < childrenLength; i++) { + childArray[i] = arguments[i + 3]; + } + + props.children = childArray; + } + + return { + $$typeof: REACT_ELEMENT_TYPE, + type: type, + key: key === undefined ? null : '' + key, + ref: null, + props: props, + _owner: null + }; + }; +}(); + +var asyncToGenerator = function (fn) { + return function () { + var gen = fn.apply(this, arguments); + return new Promise(function (resolve, reject) { + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + return Promise.resolve(value).then(function (value) { + return step("next", value); + }, function (err) { + return step("throw", err); + }); + } + } + + return step("next"); + }); + }; +}; + +var classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; -babelHelpers.createClass = function () { +var createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; @@ -46152,7 +46773,33 @@ babelHelpers.createClass = function () { }; }(); -babelHelpers.defineProperty = function (obj, key, value) { +var defineEnumerableProperties = function (obj, descs) { + for (var key in descs) { + var desc = descs[key]; + desc.configurable = desc.enumerable = true; + if ("value" in desc) desc.writable = true; + Object.defineProperty(obj, key, desc); + } + + return obj; +}; + +var defaults = function (obj, defaults) { + var keys = Object.getOwnPropertyNames(defaults); + + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = Object.getOwnPropertyDescriptor(defaults, key); + + if (value && value.configurable && obj[key] === undefined) { + Object.defineProperty(obj, key, value); + } + } + + return obj; +}; + +var defineProperty = function (obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, @@ -46167,7 +46814,7 @@ babelHelpers.defineProperty = function (obj, key, value) { return obj; }; -babelHelpers.extends = Object.assign || function (target) { +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; @@ -46181,7 +46828,32 @@ babelHelpers.extends = Object.assign || function (target) { return target; }; -babelHelpers.inherits = function (subClass, superClass) { +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; + + if (getter === undefined) { + return undefined; + } + + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } @@ -46197,7 +46869,48 @@ babelHelpers.inherits = function (subClass, superClass) { if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }; -babelHelpers.objectWithoutProperties = function (obj, keys) { +var _instanceof = function (left, right) { + if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { + return right[Symbol.hasInstance](left); + } else { + return left instanceof right; + } +}; + +var interopRequireDefault = function (obj) { + return obj && obj.__esModule ? obj : { + default: obj + }; +}; + +var interopRequireWildcard = function (obj) { + if (obj && obj.__esModule) { + return obj; + } else { + var newObj = {}; + + if (obj != null) { + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; + } + } + + newObj.default = obj; + return newObj; + } +}; + +var newArrowCheck = function (innerThis, boundThis) { + if (innerThis !== boundThis) { + throw new TypeError("Cannot instantiate an arrow function"); + } +}; + +var objectDestructuringEmpty = function (obj) { + if (obj == null) throw new TypeError("Cannot destructure undefined"); +}; + +var objectWithoutProperties = function (obj, keys) { var target = {}; for (var i in obj) { @@ -46209,7 +46922,7 @@ babelHelpers.objectWithoutProperties = function (obj, keys) { return target; }; -babelHelpers.possibleConstructorReturn = function (self, call) { +var possibleConstructorReturn = function (self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } @@ -46217,59 +46930,158 @@ babelHelpers.possibleConstructorReturn = function (self, call) { return call && (typeof call === "object" || typeof call === "function") ? call : self; }; -babelHelpers.toConsumableArray = function (arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; +var selfGlobal = typeof global === "undefined" ? self : global; - return arr2; +var set = function set(object, property, value, receiver) { + var desc = Object.getOwnPropertyDescriptor(object, property); + + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); + + if (parent !== null) { + set(parent, property, value, receiver); + } + } else if ("value" in desc && desc.writable) { + desc.value = value; } else { - return Array.from(arr); + var setter = desc.set; + + if (setter !== undefined) { + setter.call(receiver, value); + } } + + return value; }; -babelHelpers; +var slicedToArray = function () { + function sliceIterator(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; -// GENERATED FILE -var defaultLocaleData = { "locale": "en", "pluralRuleFunction": function pluralRuleFunction(n, ord) { - var s = String(n).split("."), - v0 = !s[1], - t0 = Number(s[0]) == n, - n10 = t0 && s[0].slice(-1), - n100 = t0 && s[0].slice(-2);if (ord) return n10 == 1 && n100 != 11 ? "one" : n10 == 2 && n100 != 12 ? "two" : n10 == 3 && n100 != 13 ? "few" : "other";return n == 1 && v0 ? "one" : "other"; - }, "fields": { "year": { "displayName": "year", "relative": { "0": "this year", "1": "next year", "-1": "last year" }, "relativeTime": { "future": { "one": "in {0} year", "other": "in {0} years" }, "past": { "one": "{0} year ago", "other": "{0} years ago" } } }, "month": { "displayName": "month", "relative": { "0": "this month", "1": "next month", "-1": "last month" }, "relativeTime": { "future": { "one": "in {0} month", "other": "in {0} months" }, "past": { "one": "{0} month ago", "other": "{0} months ago" } } }, "day": { "displayName": "day", "relative": { "0": "today", "1": "tomorrow", "-1": "yesterday" }, "relativeTime": { "future": { "one": "in {0} day", "other": "in {0} days" }, "past": { "one": "{0} day ago", "other": "{0} days ago" } } }, "hour": { "displayName": "hour", "relativeTime": { "future": { "one": "in {0} hour", "other": "in {0} hours" }, "past": { "one": "{0} hour ago", "other": "{0} hours ago" } } }, "minute": { "displayName": "minute", "relativeTime": { "future": { "one": "in {0} minute", "other": "in {0} minutes" }, "past": { "one": "{0} minute ago", "other": "{0} minutes ago" } } }, "second": { "displayName": "second", "relative": { "0": "now" }, "relativeTime": { "future": { "one": "in {0} second", "other": "in {0} seconds" }, "past": { "one": "{0} second ago", "other": "{0} seconds ago" } } } } }; + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); -function addLocaleData() { - var data = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"]) _i["return"](); + } finally { + if (_d) throw _e; + } + } - var locales = Array.isArray(data) ? data : [data]; + return _arr; + } - locales.forEach(function (localeData) { - if (localeData && localeData.locale) { - IntlMessageFormat.__addLocaleData(localeData); - IntlRelativeFormat.__addLocaleData(localeData); - } - }); -} + return function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + return sliceIterator(arr, i); + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + }; +}(); -function hasLocaleData(locale) { - var localeParts = (locale || '').split('-'); +var slicedToArrayLoose = function (arr, i) { + if (Array.isArray(arr)) { + return arr; + } else if (Symbol.iterator in Object(arr)) { + var _arr = []; - while (localeParts.length > 0) { - if (hasIMFAndIRFLocaleData(localeParts.join('-'))) { - return true; - } + for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { + _arr.push(_step.value); - localeParts.pop(); + if (i && _arr.length === i) break; } - return false; -} + return _arr; + } else { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } +}; -function hasIMFAndIRFLocaleData(locale) { - var normalizedLocale = locale && locale.toLowerCase(); +var taggedTemplateLiteral = function (strings, raw) { + return Object.freeze(Object.defineProperties(strings, { + raw: { + value: Object.freeze(raw) + } + })); +}; - return !!(IntlMessageFormat.__localeData__[normalizedLocale] && IntlRelativeFormat.__localeData__[normalizedLocale]); -} +var taggedTemplateLiteralLoose = function (strings, raw) { + strings.raw = raw; + return strings; +}; + +var temporalRef = function (val, name, undef) { + if (val === undef) { + throw new ReferenceError(name + " is not defined - temporal dead zone"); + } else { + return val; + } +}; + +var temporalUndefined = {}; + +var toArray = function (arr) { + return Array.isArray(arr) ? arr : Array.from(arr); +}; + +var toConsumableArray = function (arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } else { + return Array.from(arr); + } +}; + + + +var babelHelpers$1 = Object.freeze({ + _typeof: _typeof, + jsx: jsx, + asyncToGenerator: asyncToGenerator, + classCallCheck: classCallCheck, + createClass: createClass, + defineEnumerableProperties: defineEnumerableProperties, + defaults: defaults, + defineProperty: defineProperty, + _extends: _extends, + get: get, + inherits: inherits, + _instanceof: _instanceof, + interopRequireDefault: interopRequireDefault, + interopRequireWildcard: interopRequireWildcard, + newArrowCheck: newArrowCheck, + objectDestructuringEmpty: objectDestructuringEmpty, + objectWithoutProperties: objectWithoutProperties, + possibleConstructorReturn: possibleConstructorReturn, + selfGlobal: selfGlobal, + set: set, + slicedToArray: slicedToArray, + slicedToArrayLoose: slicedToArrayLoose, + taggedTemplateLiteral: taggedTemplateLiteral, + taggedTemplateLiteralLoose: taggedTemplateLiteralLoose, + temporalRef: temporalRef, + temporalUndefined: temporalUndefined, + toArray: toArray, + toConsumableArray: toConsumableArray, + typeof: _typeof, + extends: _extends, + instanceof: _instanceof +}); var bool = React.PropTypes.bool; var number = React.PropTypes.number; @@ -46299,7 +47111,7 @@ var intlFormatPropTypes = { formatHTMLMessage: func.isRequired }; -var intlShape = shape(babelHelpers['extends']({}, intlConfigPropTypes, intlFormatPropTypes, { +var intlShape = shape(babelHelpers$1['extends']({}, intlConfigPropTypes, intlFormatPropTypes, { formatters: object, now: func.isRequired })); @@ -46397,7 +47209,7 @@ function shallowEquals(objA, objB) { return true; } - if ((typeof objA === 'undefined' ? 'undefined' : babelHelpers['typeof'](objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : babelHelpers['typeof'](objB)) !== 'object' || objB === null) { + if ((typeof objA === 'undefined' ? 'undefined' : babelHelpers$1['typeof'](objA)) !== 'object' || objA === null || (typeof objB === 'undefined' ? 'undefined' : babelHelpers$1['typeof'](objB)) !== 'object' || objB === null) { return false; } @@ -46446,18 +47258,18 @@ function injectIntl(WrappedComponent) { var withRef = _options$withRef === undefined ? false : _options$withRef; var InjectIntl = function (_Component) { - babelHelpers.inherits(InjectIntl, _Component); + inherits(InjectIntl, _Component); function InjectIntl(props, context) { - babelHelpers.classCallCheck(this, InjectIntl); + classCallCheck(this, InjectIntl); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(InjectIntl).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(InjectIntl).call(this, props, context)); invariantIntlContext(context); return _this; } - babelHelpers.createClass(InjectIntl, [{ + createClass(InjectIntl, [{ key: 'getWrappedInstance', value: function getWrappedInstance() { invariant(withRef, '[React Intl] To access the wrapped instance, ' + 'the `{withRef: true}` option must be set when calling: ' + '`injectIntl()`'); @@ -46467,7 +47279,7 @@ function injectIntl(WrappedComponent) { }, { key: 'render', value: function render() { - return React__default.createElement(WrappedComponent, babelHelpers['extends']({}, this.props, babelHelpers.defineProperty({}, intlPropName, this.context.intl), { + return React__default.createElement(WrappedComponent, babelHelpers$1['extends']({}, this.props, defineProperty({}, intlPropName, this.context.intl), { ref: withRef ? 'wrappedInstance' : null })); } @@ -46510,7 +47322,7 @@ function findPluralFunction(locale) { var IntlPluralFormat = function IntlPluralFormat(locales) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; - babelHelpers.classCallCheck(this, IntlPluralFormat); + classCallCheck(this, IntlPluralFormat); var useOrdinal = options.style === 'ordinal'; var pluralFn = findPluralFunction(resolveLocale(locales)); @@ -46620,7 +47432,7 @@ function formatRelative(config, state, value) { // Capture the current threshold values, then temporarily override them with // specific values just for this render. - var oldThresholds = babelHelpers['extends']({}, IntlRelativeFormat.thresholds); + var oldThresholds = babelHelpers$1['extends']({}, IntlRelativeFormat.thresholds); updateRelativeFormatThresholds(RELATIVE_FORMAT_THRESHOLDS); try { @@ -46761,6 +47573,8 @@ function formatHTMLMessage(config, state, messageDescriptor) { return formatMessage(config, state, messageDescriptor, escapedValues); } + + var format = Object.freeze({ formatDate: formatDate, formatTime: formatTime, @@ -46785,12 +47599,12 @@ var defaultProps = { }; var IntlProvider = function (_Component) { - babelHelpers.inherits(IntlProvider, _Component); + inherits(IntlProvider, _Component); function IntlProvider(props, context) { - babelHelpers.classCallCheck(this, IntlProvider); + classCallCheck(this, IntlProvider); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(IntlProvider).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(IntlProvider).call(this, props, context)); invariant(typeof Intl !== 'undefined', '[React Intl] The `Intl` APIs must be available in the runtime, ' + 'and do not appear to be built-in. An `Intl` polyfill should be loaded.\n' + 'See: http://formatjs.io/guides/runtime-environments/'); @@ -46826,7 +47640,7 @@ var IntlProvider = function (_Component) { } : _ref$formatters; - _this.state = babelHelpers['extends']({}, formatters, { + _this.state = babelHelpers$1['extends']({}, formatters, { // Wrapper to provide stable "now" time for initial render. now: function now() { @@ -46836,7 +47650,7 @@ var IntlProvider = function (_Component) { return _this; } - babelHelpers.createClass(IntlProvider, [{ + createClass(IntlProvider, [{ key: 'getConfig', value: function getConfig() { var intlContext = this.context.intl; @@ -46871,7 +47685,7 @@ var IntlProvider = function (_Component) { // The `messages` are overridden to the `defaultProps` empty object // to maintain referential equality across re-renders. It's assumed // each contains a `defaultMessage` prop. - config = babelHelpers['extends']({}, config, { + config = babelHelpers$1['extends']({}, config, { locale: defaultLocale, formats: defaultFormats, messages: defaultProps.messages @@ -46898,11 +47712,11 @@ var IntlProvider = function (_Component) { var _state = this.state; var now = _state.now; - var formatters = babelHelpers.objectWithoutProperties(_state, ['now']); + var formatters = objectWithoutProperties(_state, ['now']); return { - intl: babelHelpers['extends']({}, config, boundFormatFns, { + intl: babelHelpers$1['extends']({}, config, boundFormatFns, { formatters: formatters, now: now }) @@ -46941,24 +47755,24 @@ IntlProvider.childContextTypes = { intl: intlShape.isRequired }; -IntlProvider.propTypes = babelHelpers['extends']({}, intlConfigPropTypes, { +IntlProvider.propTypes = babelHelpers$1['extends']({}, intlConfigPropTypes, { children: React.PropTypes.element.isRequired, initialNow: React.PropTypes.any }); var FormattedDate = function (_Component) { - babelHelpers.inherits(FormattedDate, _Component); + inherits(FormattedDate, _Component); function FormattedDate(props, context) { - babelHelpers.classCallCheck(this, FormattedDate); + classCallCheck(this, FormattedDate); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedDate).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(FormattedDate).call(this, props, context)); invariantIntlContext(context); return _this; } - babelHelpers.createClass(FormattedDate, [{ + createClass(FormattedDate, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate() { for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) { @@ -46998,25 +47812,25 @@ FormattedDate.contextTypes = { intl: intlShape }; -FormattedDate.propTypes = babelHelpers['extends']({}, dateTimeFormatPropTypes, { +FormattedDate.propTypes = babelHelpers$1['extends']({}, dateTimeFormatPropTypes, { value: React.PropTypes.any.isRequired, format: React.PropTypes.string, children: React.PropTypes.func }); var FormattedTime = function (_Component) { - babelHelpers.inherits(FormattedTime, _Component); + inherits(FormattedTime, _Component); function FormattedTime(props, context) { - babelHelpers.classCallCheck(this, FormattedTime); + classCallCheck(this, FormattedTime); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedTime).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(FormattedTime).call(this, props, context)); invariantIntlContext(context); return _this; } - babelHelpers.createClass(FormattedTime, [{ + createClass(FormattedTime, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate() { for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) { @@ -47056,7 +47870,7 @@ FormattedTime.contextTypes = { intl: intlShape }; -FormattedTime.propTypes = babelHelpers['extends']({}, dateTimeFormatPropTypes, { +FormattedTime.propTypes = babelHelpers$1['extends']({}, dateTimeFormatPropTypes, { value: React.PropTypes.any.isRequired, format: React.PropTypes.string, children: React.PropTypes.func @@ -47106,13 +47920,24 @@ function getUnitDelay(units) { } } +function isSameDate(a, b) { + if (a === b) { + return true; + } + + var aTime = new Date(a).getTime(); + var bTime = new Date(b).getTime(); + + return isFinite(aTime) && isFinite(bTime) && aTime === bTime; +} + var FormattedRelative = function (_Component) { - babelHelpers.inherits(FormattedRelative, _Component); + inherits(FormattedRelative, _Component); function FormattedRelative(props, context) { - babelHelpers.classCallCheck(this, FormattedRelative); + classCallCheck(this, FormattedRelative); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedRelative).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(FormattedRelative).call(this, props, context)); invariantIntlContext(context); @@ -47124,7 +47949,7 @@ var FormattedRelative = function (_Component) { return _this; } - babelHelpers.createClass(FormattedRelative, [{ + createClass(FormattedRelative, [{ key: 'scheduleNextUpdate', value: function scheduleNextUpdate(props, state) { var _this2 = this; @@ -47157,6 +47982,22 @@ var FormattedRelative = function (_Component) { _this2.setState({ now: _this2.context.intl.now() }); }, delay); } + }, { + key: 'componentDidMount', + value: function componentDidMount() { + this.scheduleNextUpdate(this.props, this.state); + } + }, { + key: 'componentWillReceiveProps', + value: function componentWillReceiveProps(_ref) { + var nextValue = _ref.value; + + // When the `props.value` date changes, `state.now` needs to be updated, + // and the next update can be rescheduled. + if (!isSameDate(nextValue, this.props.value)) { + this.setState({ now: this.context.intl.now() }); + } + } }, { key: 'shouldComponentUpdate', value: function shouldComponentUpdate() { @@ -47171,11 +48012,6 @@ var FormattedRelative = function (_Component) { value: function componentWillUpdate(nextProps, nextState) { this.scheduleNextUpdate(nextProps, nextState); } - }, { - key: 'componentDidMount', - value: function componentDidMount() { - this.scheduleNextUpdate(this.props, this.state); - } }, { key: 'componentWillUnmount', value: function componentWillUnmount() { @@ -47190,7 +48026,7 @@ var FormattedRelative = function (_Component) { var children = _props.children; - var formattedRelative = formatRelative(value, babelHelpers['extends']({}, this.props, this.state)); + var formattedRelative = formatRelative(value, babelHelpers$1['extends']({}, this.props, this.state)); if (typeof children === 'function') { return children(formattedRelative); @@ -47212,7 +48048,7 @@ FormattedRelative.contextTypes = { intl: intlShape }; -FormattedRelative.propTypes = babelHelpers['extends']({}, relativeFormatPropTypes, { +FormattedRelative.propTypes = babelHelpers$1['extends']({}, relativeFormatPropTypes, { value: React.PropTypes.any.isRequired, format: React.PropTypes.string, updateInterval: React.PropTypes.number, @@ -47225,18 +48061,18 @@ FormattedRelative.defaultProps = { }; var FormattedNumber = function (_Component) { - babelHelpers.inherits(FormattedNumber, _Component); + inherits(FormattedNumber, _Component); function FormattedNumber(props, context) { - babelHelpers.classCallCheck(this, FormattedNumber); + classCallCheck(this, FormattedNumber); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedNumber).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(FormattedNumber).call(this, props, context)); invariantIntlContext(context); return _this; } - babelHelpers.createClass(FormattedNumber, [{ + createClass(FormattedNumber, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate() { for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) { @@ -47276,25 +48112,25 @@ FormattedNumber.contextTypes = { intl: intlShape }; -FormattedNumber.propTypes = babelHelpers['extends']({}, numberFormatPropTypes, { +FormattedNumber.propTypes = babelHelpers$1['extends']({}, numberFormatPropTypes, { value: React.PropTypes.any.isRequired, format: React.PropTypes.string, children: React.PropTypes.func }); var FormattedPlural = function (_Component) { - babelHelpers.inherits(FormattedPlural, _Component); + inherits(FormattedPlural, _Component); function FormattedPlural(props, context) { - babelHelpers.classCallCheck(this, FormattedPlural); + classCallCheck(this, FormattedPlural); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedPlural).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(FormattedPlural).call(this, props, context)); invariantIntlContext(context); return _this; } - babelHelpers.createClass(FormattedPlural, [{ + createClass(FormattedPlural, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate() { for (var _len = arguments.length, next = Array(_len), _key = 0; _key < _len; _key++) { @@ -47336,7 +48172,7 @@ FormattedPlural.contextTypes = { intl: intlShape }; -FormattedPlural.propTypes = babelHelpers['extends']({}, pluralFormatPropTypes, { +FormattedPlural.propTypes = babelHelpers$1['extends']({}, pluralFormatPropTypes, { value: React.PropTypes.any.isRequired, other: React.PropTypes.node.isRequired, @@ -47354,18 +48190,18 @@ FormattedPlural.defaultProps = { }; var FormattedMessage = function (_Component) { - babelHelpers.inherits(FormattedMessage, _Component); + inherits(FormattedMessage, _Component); function FormattedMessage(props, context) { - babelHelpers.classCallCheck(this, FormattedMessage); + classCallCheck(this, FormattedMessage); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedMessage).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(FormattedMessage).call(this, props, context)); invariantIntlContext(context); return _this; } - babelHelpers.createClass(FormattedMessage, [{ + createClass(FormattedMessage, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate(nextProps) { var values = this.props.values; @@ -47379,7 +48215,7 @@ var FormattedMessage = function (_Component) { // Since `values` has already been checked, we know they're not // different, so the current `values` are carried over so the shallow // equals comparison on the other props isn't affected by the `values`. - var nextPropsToCheck = babelHelpers['extends']({}, nextProps, { + var nextPropsToCheck = babelHelpers$1['extends']({}, nextProps, { values: values }); @@ -47467,10 +48303,10 @@ var FormattedMessage = function (_Component) { } if (typeof children === 'function') { - return children.apply(undefined, babelHelpers.toConsumableArray(nodes)); + return children.apply(undefined, toConsumableArray(nodes)); } - return React.createElement.apply(undefined, [tagName, null].concat(babelHelpers.toConsumableArray(nodes))); + return React.createElement.apply(undefined, [tagName, null].concat(toConsumableArray(nodes))); } }]); return FormattedMessage; @@ -47482,7 +48318,7 @@ FormattedMessage.contextTypes = { intl: intlShape }; -FormattedMessage.propTypes = babelHelpers['extends']({}, messageDescriptorPropTypes, { +FormattedMessage.propTypes = babelHelpers$1['extends']({}, messageDescriptorPropTypes, { values: React.PropTypes.object, tagName: React.PropTypes.string, children: React.PropTypes.func @@ -47494,18 +48330,18 @@ FormattedMessage.defaultProps = { }; var FormattedHTMLMessage = function (_Component) { - babelHelpers.inherits(FormattedHTMLMessage, _Component); + inherits(FormattedHTMLMessage, _Component); function FormattedHTMLMessage(props, context) { - babelHelpers.classCallCheck(this, FormattedHTMLMessage); + classCallCheck(this, FormattedHTMLMessage); - var _this = babelHelpers.possibleConstructorReturn(this, Object.getPrototypeOf(FormattedHTMLMessage).call(this, props, context)); + var _this = possibleConstructorReturn(this, Object.getPrototypeOf(FormattedHTMLMessage).call(this, props, context)); invariantIntlContext(context); return _this; } - babelHelpers.createClass(FormattedHTMLMessage, [{ + createClass(FormattedHTMLMessage, [{ key: 'shouldComponentUpdate', value: function shouldComponentUpdate(nextProps) { var values = this.props.values; @@ -47519,7 +48355,7 @@ var FormattedHTMLMessage = function (_Component) { // Since `values` has already been checked, we know they're not // different, so the current `values` are carried over so the shallow // equals comparison on the other props isn't affected by the `values`. - var nextPropsToCheck = babelHelpers['extends']({}, nextProps, { + var nextPropsToCheck = babelHelpers$1['extends']({}, nextProps, { values: values }); @@ -47573,7 +48409,7 @@ FormattedHTMLMessage.contextTypes = { intl: intlShape }; -FormattedHTMLMessage.propTypes = babelHelpers['extends']({}, messageDescriptorPropTypes, { +FormattedHTMLMessage.propTypes = babelHelpers$1['extends']({}, messageDescriptorPropTypes, { values: React.PropTypes.object, tagName: React.PropTypes.string, children: React.PropTypes.func @@ -47600,15 +48436,15 @@ exports.FormattedNumber = FormattedNumber; exports.FormattedPlural = FormattedPlural; exports.FormattedMessage = FormattedMessage; exports.FormattedHTMLMessage = FormattedHTMLMessage; -}).call(this,_dereq_('_process')) +}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../locale-data/index.js":1,"_process":2,"intl-format-cache":256,"intl-messageformat":259,"intl-relativeformat":268,"invariant":274,"react":475}],256:[function(_dereq_,module,exports){ +},{"../locale-data/index.js":1,"_process":2,"intl-format-cache":276,"intl-messageformat":279,"intl-relativeformat":288,"invariant":294,"react":496}],276:[function(_dereq_,module,exports){ 'use strict'; exports = module.exports = _dereq_('./lib/memoizer')['default']; exports['default'] = exports; -},{"./lib/memoizer":258}],257:[function(_dereq_,module,exports){ +},{"./lib/memoizer":278}],277:[function(_dereq_,module,exports){ "use strict"; /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. @@ -47688,7 +48524,7 @@ var objCreate = Object.create || function (proto, props) { exports.bind = bind, exports.defineProperty = defineProperty, exports.objCreate = objCreate; -},{}],258:[function(_dereq_,module,exports){ +},{}],278:[function(_dereq_,module,exports){ "use strict"; var src$es5$$ = _dereq_("./es5"); exports["default"] = createFormatCache; @@ -47764,7 +48600,7 @@ function orderedProps(obj) { } -},{"./es5":257}],259:[function(_dereq_,module,exports){ +},{"./es5":277}],279:[function(_dereq_,module,exports){ /* jshint node:true */ 'use strict'; @@ -47781,7 +48617,7 @@ _dereq_('./lib/locales'); exports = module.exports = IntlMessageFormat; exports['default'] = exports; -},{"./lib/locales":1,"./lib/main":264}],260:[function(_dereq_,module,exports){ +},{"./lib/locales":1,"./lib/main":284}],280:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -47991,7 +48827,7 @@ SelectFormat.prototype.getOption = function (value) { }; -},{}],261:[function(_dereq_,module,exports){ +},{}],281:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -48256,13 +49092,13 @@ MessageFormat.prototype._resolveLocale = function (locales) { }; -},{"./compiler":260,"./es5":263,"./utils":265,"intl-messageformat-parser":266}],262:[function(_dereq_,module,exports){ +},{"./compiler":280,"./es5":283,"./utils":285,"intl-messageformat-parser":286}],282:[function(_dereq_,module,exports){ // GENERATED FILE "use strict"; exports["default"] = {"locale":"en","pluralRuleFunction":function (n,ord){var s=String(n).split("."),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?"one":n10==2&&n100!=12?"two":n10==3&&n100!=13?"few":"other";return n==1&&v0?"one":"other"}}; -},{}],263:[function(_dereq_,module,exports){ +},{}],283:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -48312,7 +49148,7 @@ var objCreate = Object.create || function (proto, props) { exports.defineProperty = defineProperty, exports.objCreate = objCreate; -},{"./utils":265}],264:[function(_dereq_,module,exports){ +},{"./utils":285}],284:[function(_dereq_,module,exports){ /* jslint esnext: true */ "use strict"; @@ -48324,7 +49160,7 @@ src$core$$["default"].defaultLocale = 'en'; exports["default"] = src$core$$["default"]; -},{"./core":261,"./en":262}],265:[function(_dereq_,module,exports){ +},{"./core":281,"./en":282}],285:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -48357,13 +49193,13 @@ function extend(obj) { exports.hop = hop; -},{}],266:[function(_dereq_,module,exports){ +},{}],286:[function(_dereq_,module,exports){ 'use strict'; exports = module.exports = _dereq_('./lib/parser')['default']; exports['default'] = exports; -},{"./lib/parser":267}],267:[function(_dereq_,module,exports){ +},{"./lib/parser":287}],287:[function(_dereq_,module,exports){ "use strict"; exports["default"] = (function() { @@ -49723,7 +50559,7 @@ exports["default"] = (function() { })(); -},{}],268:[function(_dereq_,module,exports){ +},{}],288:[function(_dereq_,module,exports){ /* jshint node:true */ 'use strict'; @@ -49740,7 +50576,7 @@ _dereq_('./lib/locales'); exports = module.exports = IntlRelativeFormat; exports['default'] = exports; -},{"./lib/locales":1,"./lib/main":273}],269:[function(_dereq_,module,exports){ +},{"./lib/locales":1,"./lib/main":293}],289:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -50038,7 +50874,7 @@ RelativeFormat.prototype._selectUnits = function (diffReport) { }; -},{"./diff":270,"./es5":272,"intl-messageformat":259}],270:[function(_dereq_,module,exports){ +},{"./diff":290,"./es5":292,"intl-messageformat":279}],290:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -50085,13 +50921,13 @@ exports["default"] = function (from, to) { }; -},{}],271:[function(_dereq_,module,exports){ +},{}],291:[function(_dereq_,module,exports){ // GENERATED FILE "use strict"; exports["default"] = {"locale":"en","pluralRuleFunction":function (n,ord){var s=String(n).split("."),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?"one":n10==2&&n100!=12?"two":n10==3&&n100!=13?"few":"other";return n==1&&v0?"one":"other"},"fields":{"year":{"displayName":"year","relative":{"0":"this year","1":"next year","-1":"last year"},"relativeTime":{"future":{"one":"in {0} year","other":"in {0} years"},"past":{"one":"{0} year ago","other":"{0} years ago"}}},"month":{"displayName":"month","relative":{"0":"this month","1":"next month","-1":"last month"},"relativeTime":{"future":{"one":"in {0} month","other":"in {0} months"},"past":{"one":"{0} month ago","other":"{0} months ago"}}},"day":{"displayName":"day","relative":{"0":"today","1":"tomorrow","-1":"yesterday"},"relativeTime":{"future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"}}},"hour":{"displayName":"hour","relativeTime":{"future":{"one":"in {0} hour","other":"in {0} hours"},"past":{"one":"{0} hour ago","other":"{0} hours ago"}}},"minute":{"displayName":"minute","relativeTime":{"future":{"one":"in {0} minute","other":"in {0} minutes"},"past":{"one":"{0} minute ago","other":"{0} minutes ago"}}},"second":{"displayName":"second","relative":{"0":"now"},"relativeTime":{"future":{"one":"in {0} second","other":"in {0} seconds"},"past":{"one":"{0} second ago","other":"{0} seconds ago"}}}}}; -},{}],272:[function(_dereq_,module,exports){ +},{}],292:[function(_dereq_,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -50167,9 +51003,9 @@ var dateNow = Date.now || function () { exports.defineProperty = defineProperty, exports.objCreate = objCreate, exports.arrIndexOf = arrIndexOf, exports.isArray = isArray, exports.dateNow = dateNow; -},{}],273:[function(_dereq_,module,exports){ -arguments[4][264][0].apply(exports,arguments) -},{"./core":269,"./en":271,"dup":264}],274:[function(_dereq_,module,exports){ +},{}],293:[function(_dereq_,module,exports){ +arguments[4][284][0].apply(exports,arguments) +},{"./core":289,"./en":291,"dup":284}],294:[function(_dereq_,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -50225,7 +51061,7 @@ module.exports = invariant; }).call(this,_dereq_('_process')) -},{"_process":2}],275:[function(_dereq_,module,exports){ +},{"_process":2}],295:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -50307,7 +51143,7 @@ Provider.childContextTypes = { }; }).call(this,_dereq_('_process')) -},{"../utils/storeShape":279,"../utils/warning":280,"_process":2,"react":475}],276:[function(_dereq_,module,exports){ +},{"../utils/storeShape":299,"../utils/warning":300,"_process":2,"react":496}],296:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -50704,7 +51540,7 @@ function connect(mapStateToProps, mapDispatchToProps, mergeProps) { } }).call(this,_dereq_('_process')) -},{"../utils/shallowEqual":278,"../utils/storeShape":279,"../utils/warning":280,"../utils/wrapActionCreators":281,"_process":2,"hoist-non-react-statics":282,"invariant":283,"lodash/isPlainObject":287,"react":475}],277:[function(_dereq_,module,exports){ +},{"../utils/shallowEqual":298,"../utils/storeShape":299,"../utils/warning":300,"../utils/wrapActionCreators":301,"_process":2,"hoist-non-react-statics":302,"invariant":303,"lodash/isPlainObject":308,"react":496}],297:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -50722,7 +51558,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "d exports.Provider = _Provider2["default"]; exports.connect = _connect2["default"]; -},{"./components/Provider":275,"./components/connect":276}],278:[function(_dereq_,module,exports){ +},{"./components/Provider":295,"./components/connect":296}],298:[function(_dereq_,module,exports){ "use strict"; exports.__esModule = true; @@ -50749,7 +51585,7 @@ function shallowEqual(objA, objB) { return true; } -},{}],279:[function(_dereq_,module,exports){ +},{}],299:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -50761,7 +51597,7 @@ exports["default"] = _react.PropTypes.shape({ dispatch: _react.PropTypes.func.isRequired, getState: _react.PropTypes.func.isRequired }); -},{"react":475}],280:[function(_dereq_,module,exports){ +},{"react":496}],300:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -50786,7 +51622,7 @@ function warning(message) { } catch (e) {} /* eslint-enable no-empty */ } -},{}],281:[function(_dereq_,module,exports){ +},{}],301:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; @@ -50799,7 +51635,7 @@ function wrapActionCreators(actionCreators) { return (0, _redux.bindActionCreators)(actionCreators, dispatch); }; } -},{"redux":484}],282:[function(_dereq_,module,exports){ +},{"redux":505}],302:[function(_dereq_,module,exports){ /** * Copyright 2015, Yahoo! Inc. * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. @@ -50826,11 +51662,19 @@ var KNOWN_STATICS = { arity: true }; -module.exports = function hoistNonReactStatics(targetComponent, sourceComponent) { +var isGetOwnPropertySymbolsAvailable = typeof Object.getOwnPropertySymbols === 'function'; + +module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, customStatics) { if (typeof sourceComponent !== 'string') { // don't hoist over string (html) components var keys = Object.getOwnPropertyNames(sourceComponent); - for (var i=0; i Date: Mon, 15 Aug 2016 17:54:25 +0100 Subject: [PATCH 03/16] PI-721 refactor to use DefaultIntegration instead of CpanelIntegration --- src/Cpanel/ClientActions.php | 9 +++++---- src/Cpanel/HostActions.php | 15 ++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Cpanel/ClientActions.php b/src/Cpanel/ClientActions.php index d3213bb5..cc79efdb 100644 --- a/src/Cpanel/ClientActions.php +++ b/src/Cpanel/ClientActions.php @@ -5,6 +5,7 @@ use CF\API\APIInterface; use CF\API\Request; use CF\Cpanel\Zone\Partial; +use CF\Integration\DefaultIntegration; class ClientActions { @@ -17,11 +18,11 @@ class ClientActions private $request; /** - * @param CpanelIntegration $cpanelIntegration - * @param APIInterface $api - * @param Request $request + * @param DefaultIntegration $cpanelIntegration + * @param APIInterface $api + * @param Request $request */ - public function __construct(CpanelIntegration $cpanelIntegration, APIInterface $api, Request $request) + public function __construct(DefaultIntegration $cpanelIntegration, APIInterface $api, Request $request) { $this->api = $api; $this->config = $cpanelIntegration->getConfig(); diff --git a/src/Cpanel/HostActions.php b/src/Cpanel/HostActions.php index 68ac59ed..87d09f90 100644 --- a/src/Cpanel/HostActions.php +++ b/src/Cpanel/HostActions.php @@ -2,10 +2,11 @@ namespace CF\Cpanel; -use \CF\API\APIInterface; +use CF\API\APIInterface; use CF\API\Request; -use \CF\Cpanel\Zone\Partial; -use \CF\SecurityUtil; +use CF\Cpanel\Zone\Partial; +use CF\SecurityUtil; +use CF\Integration\DefaultIntegration; class HostActions { @@ -18,11 +19,11 @@ class HostActions private $request; /** - * @param CpanelIntegration $cpanelIntegration - * @param APIInterface $api - * @param Request $request + * @param DefaultIntegration $cpanelIntegration + * @param APIInterface $api + * @param Request $request */ - public function __construct(CpanelIntegration $cpanelIntegration, APIInterface $api, Request $request) + public function __construct(DefaultIntegration $cpanelIntegration, APIInterface $api, Request $request) { $this->api = $api; $this->config = $cpanelIntegration->getConfig(); From e7ddb719cd7345983680013f0cf438fa17118c03 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 17:56:02 +0100 Subject: [PATCH 04/16] PI-721 refactor to use correct Logger interface --- src/Cpanel/CpanelIntegration.php | 10 +++++----- src/Cpanel/DataStore.php | 13 ++++++++----- src/Cpanel/Zone/Partial.php | 4 ++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Cpanel/CpanelIntegration.php b/src/Cpanel/CpanelIntegration.php index d114b3b4..ae55643e 100644 --- a/src/Cpanel/CpanelIntegration.php +++ b/src/Cpanel/CpanelIntegration.php @@ -6,7 +6,7 @@ use CF\Integration\DataStoreInterface; use CF\Integration\IntegrationAPIInterface; use CF\Integration\IntegrationInterface; -use CF\Integration\LoggerInterface; +use Psr\Log\LoggerInterface; class CpanelIntegration implements IntegrationInterface { @@ -16,10 +16,10 @@ class CpanelIntegration implements IntegrationInterface private $logger; /** - * @param ConfigInterface $config - * @param CpanelAPI $cpanelAPI - * @param DataStoreInterface $dataStore - * @param LoggerInterface $logger + * @param ConfigInterface $config + * @param CpanelAPI $cpanelAPI + * @param DataStoreInterface $dataStore + * @param Psr\Log\LoggerInterface $logger */ public function __construct(ConfigInterface $config, CpanelAPI $cpanelAPI, DataStoreInterface $dataStore, LoggerInterface $logger) { diff --git a/src/Cpanel/DataStore.php b/src/Cpanel/DataStore.php index 10c1212d..281c2c04 100644 --- a/src/Cpanel/DataStore.php +++ b/src/Cpanel/DataStore.php @@ -1,7 +1,7 @@ yaml_data[self::DEPRECATED_HOST_USER_UNIQUE_ID_KEY])) { - return $this->yaml_data[self::DEPRECATED_HOST_USER_UNIQUE_ID_KEY][$this->username]; + public function getDeprecatedHostUserUniqueID() + { + $deprectatedHostKey = $this->get(self::DEPRECATED_HOST_USER_UNIQUE_ID_KEY); + if (isset($deprectatedHostKey)) { + return $deprectatedHostKey[$this->username]; } + return false; } diff --git a/src/Cpanel/Zone/Partial.php b/src/Cpanel/Zone/Partial.php index f9c9b152..41e34ce5 100644 --- a/src/Cpanel/Zone/Partial.php +++ b/src/Cpanel/Zone/Partial.php @@ -4,7 +4,7 @@ use CF\Cpanel\CpanelAPI; use CF\Cpanel\CpanelDNSRecord; use CF\Cpanel\DataStore; -use CF\Integration\LoggerInterface; +use Psr\Log\LoggerInterface; class Partial { @@ -30,10 +30,10 @@ public function __construct(CpanelAPI $cpanel_api, DataStore $data_store, Logger $this->logger = $logger; } - /** * @param $sub_domain * @param $domain_name + * * @return bool */ public function partialZoneSet($sub_domain, $domain_name) From 3b3b8f3ff8f290f901377aff2ec816ac5eeadbf0 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 17:58:39 +0100 Subject: [PATCH 05/16] PI-721 assign the logger CpanelAPI deserves --- src/Cpanel/CpanelAPI.php | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/Cpanel/CpanelAPI.php b/src/Cpanel/CpanelAPI.php index 9c48cfc0..30ba97a6 100644 --- a/src/Cpanel/CpanelAPI.php +++ b/src/Cpanel/CpanelAPI.php @@ -3,7 +3,7 @@ use CF\DNSRecord; use CF\Integration\IntegrationAPIInterface; -use CF\Integration\LoggerInterface; +use CF\Integration\DefaultLogger; class CpanelAPI implements IntegrationAPIInterface { @@ -16,9 +16,9 @@ class CpanelAPI implements IntegrationAPIInterface /** * @param $cpanel_api - * @param LoggerInterface $logger + * @param DefaultLogger $logger */ - public function __construct($cpanel_api, LoggerInterface $logger) + public function __construct($cpanel_api, DefaultLogger $logger) { $this->cpanel_api = $cpanel_api; $this->logger = $logger; @@ -31,15 +31,15 @@ public function __construct($cpanel_api, LoggerInterface $logger) */ private function api2($module, $function, $parameters) { - $this->logger->logAPICall(self::CPANEL_API2_NAME, array('type' => "request", 'module' => $module, 'function' => $function, 'parameters' => $parameters), true); + $this->logAPICall(self::CPANEL_API2_NAME, array('type' => 'request', 'module' => $module, 'function' => $function, 'parameters' => $parameters), true); $cpanel_api2_response = $this->cpanel_api->api2($module, $function, $parameters); - $this->logger->logAPICall(self::CPANEL_API2_NAME, array('type' => "response", $cpanel_api2_response), $this->api2ResponseOk($cpanel_api2_response)); + $this->logAPICall(self::CPANEL_API2_NAME, array('type' => 'response', $cpanel_api2_response), $this->api2ResponseOk($cpanel_api2_response)); if (!$this->api2ResponseOk($cpanel_api2_response)) { - $this->logger->logAPICall(self::CPANEL_API2_NAME, array('type' => "request", 'module' => $module, 'function' => $function, 'parameters' => $parameters), false); - $this->logger->logAPICall(self::CPANEL_API2_NAME, array('type' => "response", 'body' => $cpanel_api2_response), false); + $this->logAPICall(self::CPANEL_API2_NAME, array('type' => 'request', 'module' => $module, 'function' => $function, 'parameters' => $parameters), false); + $this->logAPICall(self::CPANEL_API2_NAME, array('type' => 'response', 'body' => $cpanel_api2_response), false); } return $cpanel_api2_response; @@ -159,16 +159,17 @@ public function removeDNSRecord($domain_name, DNSRecord $DNSRecord) */ private function uapi($module, $function, $parameters, $value) { - $this->logger->logAPICall(self::CPANEL_UAPI_NAME, array('type' => "request", 'module' => $module, 'function' => $function, 'parameters' => $parameters), true); + $this->logAPICall(self::CPANEL_UAPI_NAME, array('type' => 'request', 'module' => $module, 'function' => $function, 'parameters' => $parameters), true); $cpanel_uapi_response = $this->cpanel_api->uapi($module, $function, $parameters, $value); - $this->logger->logAPICall(self::CPANEL_UAPI_NAME, array('type' => "response", 'body' => $this->sanitize_uapi_response_for_log($cpanel_uapi_response)), $this->uapi_response_ok($cpanel_uapi_response)); + $this->logAPICall(self::CPANEL_UAPI_NAME, array('type' => 'response', 'body' => $this->sanitize_uapi_response_for_log($cpanel_uapi_response)), $this->uapi_response_ok($cpanel_uapi_response)); if ($this->uapi_response_ok($cpanel_uapi_response)) { return $cpanel_uapi_response["cpanelresult"]["result"]["data"]; } else { - $this->logger->logAPICall(self::CPANEL_UAPI_NAME, array('type' => "request", 'module' => $module, 'function' => $function, 'parameters' => $parameters), false); - $this->logger->logAPICall(self::CPANEL_UAPI_NAME, array('type' => "response", 'body' => $this->sanitize_uapi_response_for_log($cpanel_uapi_response)), false); + $this->logAPICall(self::CPANEL_UAPI_NAME, array('type' => 'request', 'module' => $module, 'function' => $function, 'parameters' => $parameters), false); + $this->logAPICall(self::CPANEL_UAPI_NAME, array('type' => 'response', 'body' => $this->sanitize_uapi_response_for_log($cpanel_uapi_response)), false); + return $cpanel_uapi_response; } } @@ -296,5 +297,15 @@ public function isAdvancedZoneEditEnabled() { * cPanel returns 1 = enabled, 0 = disabled */ return ($this->cpanel_api->cpanelfeature("zoneedit") === 1); + public function logAPICall($api, $message, $is_debug) + { + $log_level = 'error'; + if ($is_debug) { + $log_level = 'debug'; + } + if (!is_string($message)) { + $message = print_r($message, true); + } + $this->logger->$log_level('['.$api.'] '.$message); } } From 558f6021084b1c6832e96c5223551899a14ef105 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:00:46 +0100 Subject: [PATCH 06/16] PI-721 update proxy.live with the new router --- proxy.live.php | 58 ++++++++++++-------------------------------------- 1 file changed, 14 insertions(+), 44 deletions(-) diff --git a/proxy.live.php b/proxy.live.php index 660661ac..90556d9f 100644 --- a/proxy.live.php +++ b/proxy.live.php @@ -1,6 +1,7 @@ getValue("debug")); +$config = new CF\Integration\DefaultConfig(file_get_contents('config.js')); +$logger = new CF\Integration\DefaultLogger($config->getValue('debug')); $cpanelAPI = new CF\Cpanel\CpanelAPI($cpanel, $logger); $dataStore = new CF\Cpanel\DataStore($cpanelAPI, $logger); -$cpanelIntegration = new CF\Cpanel\CpanelIntegration($config, $cpanelAPI, $dataStore, $logger); +$cpanelIntegration = new CF\Integration\DefaultIntegration($config, $cpanelAPI, $dataStore, $logger); $partialZoneSet = new \CF\Cpanel\Zone\Partial($cpanelAPI, $dataStore, $logger); -$clientAPIClient = new CF\API\Client($cpanelIntegration); -$clientAPIClientRoutes = \CF\Cpanel\ClientV4APIRoutes::$routes; -$hostAPIClient = new CF\API\Host($cpanelIntegration); -$hostAPIClientRoutes = \CF\Cpanel\HostRoutes::$routes; +$requestRouter = new \CF\Router\RequestRouter($cpanelIntegration); +$requestRouter->addRouter('\CF\API\Client', \CF\Cpanel\ClientV4APIRoutes::$routes); +$requestRouter->addRouter('\CF\API\Plugin', \CF\Cpanel\PluginRoutes::getRoutes(\CF\API\PluginRoutes::$routes)); +$requestRouter->addRouter('\CF\API\Host', \CF\Cpanel\HostRoutes::$routes); $method = $_SERVER['REQUEST_METHOD']; $parameters = $_GET; -$body = json_decode(file_get_contents('php://input'),true); -$path = (strtoupper($method === "GET") ? $_GET['proxyURL'] : $body['proxyURL']); +$body = json_decode(file_get_contents('php://input'), true); +$path = (strtoupper($method === 'GET') ? $_GET['proxyURL'] : $body['proxyURL']); unset($parameters['proxyURL']); unset($body['proxyURL']); $request = new \CF\API\Request($method, $path, $parameters, $body); -//only check CSRF if its not a GET request -$isCSRFTokenValid = (($request->getMethod() === "GET") ? true : \CF\SecurityUtil::csrfTokenValidate($cpanelAPI->getHostAPIKey(), $cpanelAPI->getUserId(), $request->getBody()['cfCSRFToken'])); -unset($body['cfCSRFToken']); -$apiResponse = ""; -$apiRouter; - -if(isHostAPI($request->getUrl())) { - $apiRouter = new CF\Router\HostAPIRouter($cpanelIntegration, $hostAPIClient, $hostAPIClientRoutes); -} else if(isClientAPI($request->getUrl())) { - $apiRouter = new CF\Router\DefaultRestAPIRouter($cpanelIntegration, $clientAPIClient, $clientAPIClientRoutes); -} -if($isCSRFTokenValid) { - $apiResponse = $apiRouter->route($request); -} else { - $apiResponse = $apiRouter->getAPIClient()->createAPIError("CSRF Token not valid."); -} +$response = $requestRouter->route($request); -echo json_encode($apiResponse); +echo json_encode($response); $cpanel->end(); - -/** - * @param $path - * @return bool - */ -function isClientAPI($path) { - return (strpos($path, \CF\API\Client::ENDPOINT) !== false); -} - -/** - * @param $path - * @return bool - */ -function isHostAPI($path) { - return ($path === \CF\API\Host::ENDPOINT); -} From 246b5963dc008c088b235bf577648a62fb0e70e3 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:01:29 +0100 Subject: [PATCH 07/16] PI-721 added PluginActions and PluginRoutes --- src/Cpanel/PluginActions.php | 24 ++++++++++++++++++++++++ src/Cpanel/PluginRoutes.php | 21 +++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/Cpanel/PluginActions.php create mode 100644 src/Cpanel/PluginRoutes.php diff --git a/src/Cpanel/PluginActions.php b/src/Cpanel/PluginActions.php new file mode 100644 index 00000000..20ab3dc7 --- /dev/null +++ b/src/Cpanel/PluginActions.php @@ -0,0 +1,24 @@ + $route) { + $route['class'] = 'CF\Cpanel\PluginActions'; + $routeList[$routePath] = $route; + } + + return $routeList; + } +} From 2ee8db70d77bb21050b2c3985ae4885a0ebc1840 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:04:17 +0100 Subject: [PATCH 08/16] PI-721 added getters and setters for DataStore --- src/Cpanel/DataStore.php | 44 ++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/src/Cpanel/DataStore.php b/src/Cpanel/DataStore.php index 281c2c04..8c24b171 100644 --- a/src/Cpanel/DataStore.php +++ b/src/Cpanel/DataStore.php @@ -25,10 +25,10 @@ class DataStore implements DataStoreInterface /** - * @param CpanelAPI $cpanel - * @param LoggerInterface $logger + * @param CpanelAPI $cpanel + * @param DefaultLogger $logger */ - public function __construct(CpanelAPI $cpanel, LoggerInterface $logger) + public function __construct(CpanelAPI $cpanel, DefaultLogger $logger) { $this->cpanel = $cpanel; $this->logger = $logger; @@ -94,7 +94,8 @@ public function createUserDataStore($client_api_key, $email, $unique_id, $user_k self::HOST_USER_UNIQUE_ID_KEY => $unique_id, self::HOST_USER_KEY => $user_key ); - return $this->saveYAMLFile(); + + $this->saveYAMLFile(); } /** @@ -102,7 +103,7 @@ public function createUserDataStore($client_api_key, $email, $unique_id, $user_k */ public function getHostAPIUserUniqueId() { - return $this->yaml_data[self::HOST_USER_UNIQUE_ID_KEY]; + return $this->get(self::HOST_USER_UNIQUE_ID_KEY); } /** @@ -110,7 +111,7 @@ public function getHostAPIUserUniqueId() */ public function getClientV4APIKey() { - return $this->yaml_data[self::CLIENT_API_KEY]; + return $this->get(self::CLIENT_API_KEY); } /** @@ -118,7 +119,7 @@ public function getClientV4APIKey() */ public function getHostAPIUserKey() { - return $this->yaml_data[self::HOST_USER_KEY]; + return $this->get(self::HOST_USER_KEY); } /** @@ -126,6 +127,33 @@ public function getHostAPIUserKey() */ public function getCloudFlareEmail() { - return $this->yaml_data[self::EMAIL_KEY]; + return $this->get(self::EMAIL_KEY); + } + + /** + * @param $key + * + * @return mixed + */ + public function get($key) + { + return $this->yaml_data[$key]; + } + + /** + * @param $key + * @param $value + * + * @return mixed + */ + public function set($key, $value) + { + if (isEmpty($this->yaml_data)) { + $this->yaml_data = array(); + } + + $this->yaml_data[$key] = $value; + + return $this->saveYAMLFile(); } } From a29acaf9cd29c5983e658ecd5c642a0f73d0160f Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:05:06 +0100 Subject: [PATCH 09/16] PI-721 formating code --- src/Cpanel/ClientActions.php | 2 +- src/Cpanel/CpanelAPI.php | 85 +++++++++++++++++++++--------------- src/Cpanel/DataStore.php | 30 ++++++------- src/Cpanel/HostActions.php | 47 +++++++++++--------- src/Cpanel/Zone/Partial.php | 58 +++++++++++++++--------- 5 files changed, 130 insertions(+), 92 deletions(-) diff --git a/src/Cpanel/ClientActions.php b/src/Cpanel/ClientActions.php index cc79efdb..c62b9e7c 100644 --- a/src/Cpanel/ClientActions.php +++ b/src/Cpanel/ClientActions.php @@ -144,7 +144,7 @@ public function patchDNSRecord() */ public function deleteZone() { - if(!$this->cpanelAPI->isAdvancedZoneEditEnabled()) { + if (!$this->cpanelAPI->isAdvancedZoneEditEnabled()) { return $this->api->createAPIError(Partial::ADVANCED_ZONE_EDIT_DISABLED_ERROR); } diff --git a/src/Cpanel/CpanelAPI.php b/src/Cpanel/CpanelAPI.php index 30ba97a6..90245a68 100644 --- a/src/Cpanel/CpanelAPI.php +++ b/src/Cpanel/CpanelAPI.php @@ -1,4 +1,5 @@ api2ResponseOk($fetch_zone_records_result)) { $dnsRecordList = array(); - foreach ($fetch_zone_records_result["cpanelresult"]["data"] as $cpanelDNSRecord) { + foreach ($fetch_zone_records_result['cpanelresult']['data'] as $cpanelDNSRecord) { //if this is a record CloudFlare can proxy - if (!in_array($cpanelDNSRecord["type"], CpanelDNSRecord::$DNS_RECORDS_CF_CANNOT_PROXY)) { + if (!in_array($cpanelDNSRecord['type'], CpanelDNSRecord::$DNS_RECORDS_CF_CANNOT_PROXY)) { $cfDNSRecord = new CpanelDNSRecord(); - $content = ($cpanelDNSRecord["type"] === "CNAME") ? $cpanelDNSRecord["cname"] : $cpanelDNSRecord["address"]; + $content = ($cpanelDNSRecord['type'] === 'CNAME') ? $cpanelDNSRecord['cname'] : $cpanelDNSRecord['address']; $cfDNSRecord->setContent($content); - $cfDNSRecord->setName($cpanelDNSRecord["name"]); - $cfDNSRecord->setLine($cpanelDNSRecord["line"]); - $cfDNSRecord->setTtl($cpanelDNSRecord["ttl"]); - $cfDNSRecord->setType($cpanelDNSRecord["type"]); + $cfDNSRecord->setName($cpanelDNSRecord['name']); + $cfDNSRecord->setLine($cpanelDNSRecord['line']); + $cfDNSRecord->setTtl($cpanelDNSRecord['ttl']); + $cfDNSRecord->setType($cpanelDNSRecord['type']); array_push($dnsRecordList, $cfDNSRecord); } } + return $dnsRecordList; } - return null; + return; } - /** * @param $domain_name * @param DNSRecord $dnsRecord + * * @return bool */ public function addDNSRecord($domain_name, DNSRecord $dnsRecord) @@ -95,24 +97,26 @@ public function addDNSRecord($domain_name, DNSRecord $dnsRecord) $args = array( 'domain' => $domain_name, 'name' => $dnsRecord->getName(), - 'class' => "IN", + 'class' => 'IN', 'ttl' => $dnsRecord->getTtl(), 'type' => $dnsRecord->getType(), ); - if ($dnsRecord->getType() === "CNAME") { + if ($dnsRecord->getType() === 'CNAME') { $args['cname'] = $dnsRecord->getContent(); } else { //A, AAAA $args['address'] = $dnsRecord->getContent(); } $add_zone_record_response = $this->api2('ZoneEdit', 'add_zone_record', $args); + return $this->api2ResponseOk($add_zone_record_response); } /** * @param $domain_name * @param DNSRecord $dnsRecord + * * @return bool */ public function editDNSRecord($domain_name, DNSRecord $dnsRecord) @@ -127,7 +131,7 @@ public function editDNSRecord($domain_name, DNSRecord $dnsRecord) 'class' => 'IN', ); - if ($dnsRecord->getType() === "CNAME") { + if ($dnsRecord->getType() === 'CNAME') { $args['cname'] = $dnsRecord->getContent(); } else { //A, AAAA $args['address'] = $dnsRecord->getContent(); @@ -146,6 +150,7 @@ public function removeDNSRecord($domain_name, DNSRecord $DNSRecord) ); $remove_zone_record_response = $this->api2('ZoneEdit', 'remove_zone_record', $args); + return $this->api2ResponseOk($remove_zone_record_response); } @@ -154,7 +159,9 @@ public function removeDNSRecord($domain_name, DNSRecord $DNSRecord) * @param $function * @param $parameters * @param $value + * * @return mixed + * * @throws \Exception */ private function uapi($module, $function, $parameters, $value) @@ -165,7 +172,7 @@ private function uapi($module, $function, $parameters, $value) $this->logAPICall(self::CPANEL_UAPI_NAME, array('type' => 'response', 'body' => $this->sanitize_uapi_response_for_log($cpanel_uapi_response)), $this->uapi_response_ok($cpanel_uapi_response)); if ($this->uapi_response_ok($cpanel_uapi_response)) { - return $cpanel_uapi_response["cpanelresult"]["result"]["data"]; + return $cpanel_uapi_response['cpanelresult']['result']['data']; } else { $this->logAPICall(self::CPANEL_UAPI_NAME, array('type' => 'request', 'module' => $module, 'function' => $function, 'parameters' => $parameters), false); $this->logAPICall(self::CPANEL_UAPI_NAME, array('type' => 'response', 'body' => $this->sanitize_uapi_response_for_log($cpanel_uapi_response)), false); @@ -176,24 +183,27 @@ private function uapi($module, $function, $parameters, $value) /** * @param $cpanel_uapi_response + * * @return bool */ public function uapi_response_ok($cpanel_uapi_response) { - return ($cpanel_uapi_response["cpanelresult"]["result"]["errors"] === null); + return $cpanel_uapi_response['cpanelresult']['result']['errors'] === null; } /** * @param $cpanel_uapi_response + * * @return mixed */ private function sanitize_uapi_response_for_log($cpanel_uapi_response) { if ($this->uapi_response_ok($cpanel_uapi_response)) { - if ($cpanel_uapi_response["cpanelresult"]["func"] === "get_host_api_key") { - $cpanel_uapi_response["cpanelresult"]["result"]["data"] = "[HIDDEN]"; + if ($cpanel_uapi_response['cpanelresult']['func'] === 'get_host_api_key') { + $cpanel_uapi_response['cpanelresult']['result']['data'] = '[HIDDEN]'; } } + return $cpanel_uapi_response; } @@ -208,6 +218,7 @@ public function get_home_dir() /** * @return host api key + * * @throws \Exception */ public function getHostAPIKey() @@ -224,9 +235,9 @@ public function getUserId() return $this->cpanel_api->cpanelprint('$user'); } - /** * @param $userId + * * @return mixed */ public function getDomainList($userId = null) @@ -242,7 +253,9 @@ public function getDomainList($userId = null) /** * @param $folder * @param $filename + * * @return mixed + * * @throws \Exception */ public function load_file($folder, $filename) @@ -251,10 +264,10 @@ public function load_file($folder, $filename) 'Fileman', 'get_file_content', array( - 'dir' => $folder, - 'file' => $filename, - 'from_charset' => '_DETECT_', - 'to_charset' => '_LOCALE_', + 'dir' => $folder, + 'file' => $filename, + 'from_charset' => '_DETECT_', + 'to_charset' => '_LOCALE_', ), null ); @@ -264,6 +277,7 @@ public function load_file($folder, $filename) * @param $folder * @param $filename * @param $file_contents + * * @throws \Exception */ public function save_file($folder, $filename, $file_contents) @@ -272,11 +286,11 @@ public function save_file($folder, $filename, $file_contents) 'Fileman', 'save_file_content', array( - 'dir' => $folder, - 'file' => $filename, - 'from_charset' => 'UTF-8', - 'to_charset' => 'UTF-8', - 'content' => $file_contents, + 'dir' => $folder, + 'file' => $filename, + 'from_charset' => 'UTF-8', + 'to_charset' => 'UTF-8', + 'content' => $file_contents, ), null ); @@ -285,18 +299,21 @@ public function save_file($folder, $filename, $file_contents) public function get_cpanel_dns_record_name($cloudflare_dns_record_name) { //cpanel uses the trailing dot for all record names - return $cloudflare_dns_record_name . "."; + return $cloudflare_dns_record_name.'.'; } /** * @return bool */ - public function isAdvancedZoneEditEnabled() { + public function isAdvancedZoneEditEnabled() + { /* Advanced Zone Editor is required to edit DNS records for partial zone provisioning. * https://documentation.cpanel.net/display/SDK/Guide+to+the+LiveAPI+System+-+The+cpanelfeature%28%29+Method * cPanel returns 1 = enabled, 0 = disabled */ - return ($this->cpanel_api->cpanelfeature("zoneedit") === 1); + return $this->cpanel_api->cpanelfeature('zoneedit') === 1; + } + public function logAPICall($api, $message, $is_debug) { $log_level = 'error'; diff --git a/src/Cpanel/DataStore.php b/src/Cpanel/DataStore.php index 8c24b171..aadafac4 100644 --- a/src/Cpanel/DataStore.php +++ b/src/Cpanel/DataStore.php @@ -1,4 +1,5 @@ cpanel->load_file($this->home_dir . self::PATH_TO_YAML_FILE, self::YAML_FILE_NAME); + $get_file_content = $this->cpanel->load_file($this->home_dir.self::PATH_TO_YAML_FILE, self::YAML_FILE_NAME); if ($this->cpanel->uapi_response_ok($get_file_content)) { - return Yaml::parse($get_file_content["content"]); + return Yaml::parse($get_file_content['content']); } else { - $this->logger->error(self::PATH_TO_YAML_FILE . self::YAML_FILE_NAME . " does not exist."); + $this->logger->error(self::PATH_TO_YAML_FILE.self::YAML_FILE_NAME.' does not exist.'); } + return false; } @@ -74,17 +75,16 @@ private function loadYAMLFile() private function saveYAMLFile() { $file_contents = Yaml::dump($this->yaml_data); - $result = $this->cpanel->save_file($this->home_dir . self::PATH_TO_YAML_FILE, self::YAML_FILE_NAME, $file_contents); + $result = $this->cpanel->save_file($this->home_dir.self::PATH_TO_YAML_FILE, self::YAML_FILE_NAME, $file_contents); + return $this->cpanel->uapi_response_ok($result); } - /** * @param $client_api_key * @param $email * @param $unique_id * @param $user_key - * @return bool */ public function createUserDataStore($client_api_key, $email, $unique_id, $user_key) { @@ -92,7 +92,7 @@ public function createUserDataStore($client_api_key, $email, $unique_id, $user_k self::CLIENT_API_KEY => $client_api_key, self::EMAIL_KEY => $email, self::HOST_USER_UNIQUE_ID_KEY => $unique_id, - self::HOST_USER_KEY => $user_key + self::HOST_USER_KEY => $user_key, ); $this->saveYAMLFile(); diff --git a/src/Cpanel/HostActions.php b/src/Cpanel/HostActions.php index 87d09f90..8f978a27 100644 --- a/src/Cpanel/HostActions.php +++ b/src/Cpanel/HostActions.php @@ -37,29 +37,32 @@ public function __construct(DefaultIntegration $cpanelIntegration, APIInterface /** * @param Partial $partialZoneSet */ - public function setPartialZoneSet(Partial $partialZoneSet) { + public function setPartialZoneSet(Partial $partialZoneSet) + { $this->partialZoneSet = $partialZoneSet; } /** - * ?act=zone_set + * ?act=zone_set. + * * @return string */ public function partialZoneSet() { - if(!$this->cpanelAPI->isAdvancedZoneEditEnabled()) { + if (!$this->cpanelAPI->isAdvancedZoneEditEnabled()) { return $this->api->createAPIError(Partial::ADVANCED_ZONE_EDIT_DISABLED_ERROR); } $bodyParameters = $this->request->getBody(); - if (isset($bodyParameters["zone_name"])) { - if ($this->partialZoneSet->partialZoneSet("www." . $bodyParameters["zone_name"] . ".", $bodyParameters["zone_name"])) { - $bodyParameters["subdomains"] = "www"; + if (isset($bodyParameters['zone_name'])) { + if ($this->partialZoneSet->partialZoneSet('www.'.$bodyParameters['zone_name'].'.', $bodyParameters['zone_name'])) { + $bodyParameters['subdomains'] = 'www'; //remove trailing . get_resolve_to_value() adds to the end cause Host API doesn't want it. - $bodyParameters["resolve_to"] = rtrim($this->partialZoneSet->getResolveToValue($bodyParameters["zone_name"]), "."); + $bodyParameters['resolve_to'] = rtrim($this->partialZoneSet->getResolveToValue($bodyParameters['zone_name']), '.'); $this->request->setBody($bodyParameters); + return $this->api->callAPI($this->request); } else { - return $this->api->createAPIError("Cpanel was unable to provision '" . $bodyParameters["zone_name"] . "' please contact your hosting provider."); + return $this->api->createAPIError("Cpanel was unable to provision '".$bodyParameters['zone_name']."' please contact your hosting provider."); } } else { return $this->api->createAPIError("Missing parameter 'zone_name'."); @@ -67,7 +70,8 @@ public function partialZoneSet() } /** - * ?act=user_create + * ?act=user_create. + * * @return string */ public function userCreate() @@ -75,18 +79,18 @@ public function userCreate() $unique_id = SecurityUtil::generate16bytesOfSecureRandomData(); //if generate16BytesOfSecureRandomData fails fall back to md5 if ($unique_id === false) { - $this->logger->warn("SecurityUtil::generate16bytesOfSecureRandomData failed."); - $unique_id = md5($this->request->getBody()["cloudflare_email"] . time() . $this->cpanelAPI->getUserId() . $this->cpanelAPI->get_home_dir() . $this->cpanelAPI->getHostAPIKey()); + $this->logger->warn('SecurityUtil::generate16bytesOfSecureRandomData failed.'); + $unique_id = md5($this->request->getBody()['cloudflare_email'].time().$this->cpanelAPI->getUserId().$this->cpanelAPI->get_home_dir().$this->cpanelAPI->getHostAPIKey()); } - $parameters['body']["unique_id"] = $unique_id; + $parameters['body']['unique_id'] = $unique_id; $user_create_response = $this->api->callAPI($this->request); if ($this->api->responseOk($user_create_response)) { - $user_api_key = $user_create_response["response"]["user_api_key"]; - $cloudflare_email = $user_create_response["response"]["cloudflare_email"]; - $unique_id = $user_create_response["response"]["unique_id"]; - $user_key = $user_create_response["response"]["user_key"]; + $user_api_key = $user_create_response['response']['user_api_key']; + $cloudflare_email = $user_create_response['response']['cloudflare_email']; + $unique_id = $user_create_response['response']['unique_id']; + $user_key = $user_create_response['response']['user_key']; $this->dataStore->createUserDataStore($user_api_key, $cloudflare_email, $unique_id, $user_key); } @@ -95,7 +99,8 @@ public function userCreate() } /** - * ?act=user_auth + * ?act=user_auth. + * * @return string */ public function userAuth() @@ -103,10 +108,10 @@ public function userAuth() $user_auth_response = $this->api->callAPI($this->request); if ($this->api->responseOk($user_auth_response)) { - $user_api_key = $user_auth_response["response"]["user_api_key"]; - $cloudflare_email = $user_auth_response["response"]["cloudflare_email"]; - $unique_id = $user_auth_response["response"]["unique_id"]; - $user_key = $user_auth_response["response"]["user_key"]; + $user_api_key = $user_auth_response['response']['user_api_key']; + $cloudflare_email = $user_auth_response['response']['cloudflare_email']; + $unique_id = $user_auth_response['response']['unique_id']; + $user_key = $user_auth_response['response']['user_key']; $this->dataStore->createUserDataStore($user_api_key, $cloudflare_email, $unique_id, $user_key); } diff --git a/src/Cpanel/Zone/Partial.php b/src/Cpanel/Zone/Partial.php index 41e34ce5..d3bdafb9 100644 --- a/src/Cpanel/Zone/Partial.php +++ b/src/Cpanel/Zone/Partial.php @@ -1,4 +1,5 @@ getType()) === "CNAME") { + if (strtoupper($sub_domain_dns_record->getType()) === 'CNAME') { return $this->provisionSubDomainCNAMERecord($sub_domain_dns_record); - } else if (strtoupper($sub_domain_dns_record->getType()) === "A") { + } elseif (strtoupper($sub_domain_dns_record->getType()) === 'A') { return $this->provisionSubDomainARecord($sub_domain_dns_record); } + return false; } /** * @param $domainName + * * @return bool */ public function removePartialZoneSet($domainName) @@ -81,7 +84,7 @@ public function removePartialZoneSet($domainName) } foreach ($this->dns_record_list as $dnsRecord) { - if ($dnsRecord->getType() === "CNAME") { + if ($dnsRecord->getType() === 'CNAME') { //if this domain is pointing at cloudflare revert it. if ($dnsRecord->getContent() === $this->getForwardToValue($dnsRecord->getName())) { $dnsRecord->setContent($this->domain_name); @@ -91,6 +94,7 @@ public function removePartialZoneSet($domainName) } } } + return true; } @@ -108,14 +112,13 @@ private function getSubDomainDNSRecord($sub_domain) } } - $this->logger->error("Could not find '". $sub_domain ."' in the '" . $this->domain_name . "'. dns records."); - return null; - } + $this->logger->error("Could not find '".$sub_domain."' in the '".$this->domain_name."'. dns records."); + return; + } /** * @param $dnsRecordList - * @return null */ public function getResolveToDNSRecord($dnsRecordList) { @@ -126,13 +129,14 @@ public function getResolveToDNSRecord($dnsRecordList) } } } - $this->logger->error("Could not find the '" . self::RESOLVE_TO_PREFIX . "' record for '" . $this->domain_name . "'."); - return null; - } + $this->logger->error("Could not find the '".self::RESOLVE_TO_PREFIX."' record for '".$this->domain_name."'."); + return; + } /** * @param $subDomainCNAMEDNSRecord + * * @return bool */ private function provisionSubDomainCNAMERecord($subDomainCNAMEDNSRecord) @@ -145,29 +149,33 @@ private function provisionSubDomainCNAMERecord($subDomainCNAMEDNSRecord) //create CNAME cloudflare-resolve-to.[DOMAIN]. => [DOMAIN] if it doesn't exist. return $this->createCNAMERecord($this->getResolveToValue($this->domain_name), $this->domain_name); } + return true; } + return false; } /** * @param $name * @param $cnameValue + * * @return bool */ private function createCNAMERecord($name, $cnameValue) { $dnsRecord = new CpanelDNSRecord(); - $dnsRecord->setType("CNAME"); + $dnsRecord->setType('CNAME'); $dnsRecord->setContent($cnameValue); $dnsRecord->setName($name); $dnsRecord->setTtl(1400); + return $this->cpanel_api->addDNSRecord($this->domain_name, $dnsRecord); } - /** * @param $subDomainDNSRecord + * * @return bool */ private function provisionSubDomainARecord($subDomainDNSRecord) @@ -181,6 +189,7 @@ private function provisionSubDomainARecord($subDomainDNSRecord) if ($this->getResolveToDNSRecord($this->dns_record_list) === null) { return $this->createARecord($this->getResolveToValue($this->domain_name), $subDomainARecordIP); } + return true; } } @@ -191,20 +200,23 @@ private function provisionSubDomainARecord($subDomainDNSRecord) /** * @param $name * @param $address + * * @return bool */ private function createARecord($name, $address) { $dnsRecord = new CpanelDNSRecord(); - $dnsRecord->setType("A"); + $dnsRecord->setType('A'); $dnsRecord->setContent($address); $dnsRecord->setName($name); $dnsRecord->setTtl(1400); + return $this->cpanel_api->addDNSRecord($this->domain_name, $dnsRecord); } /** * @param $line + * * @return bool */ private function removeDNSRecord($line) @@ -215,26 +227,30 @@ private function removeDNSRecord($line) if ($this->cpanel_api->removeDNSRecord($this->domain_name, $dnsRecord)) { //after we remove a dns record refresh the list since the line numbers have changed. $this->dns_record_list = $this->cpanel_api->getDNSRecords($this->domain_name); + return true; } + return false; } /** * @param $subDomain + * * @return string */ public function getForwardToValue($subDomain) { - return $subDomain . self::FORWARD_TO_SUFFIX; + return $subDomain.self::FORWARD_TO_SUFFIX; } /** * @param $domainName + * * @return string */ public function getResolveToValue($domainName) { - return self::RESOLVE_TO_PREFIX . $domainName . "."; + return self::RESOLVE_TO_PREFIX.$domainName.'.'; } } From d220658e141329abfe5b94f338db8e0b420735bb Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:05:27 +0100 Subject: [PATCH 10/16] PI-721 update lang/en.js --- lang/en.js | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/lang/en.js b/lang/en.js index ed51163b..f51754b4 100644 --- a/lang/en.js +++ b/lang/en.js @@ -1,4 +1,12 @@ { + "component.clientLogin.form.email": "Email", + "component.clientLogin.form.apiKeyHelp": "Where can I find my API key?", + "component.clientLogin.form.apiKey": "API Key", + "component.clientLogin.form.button": "Save API Credentials", + "component.clientLogin.form.signUp": "Sign up", + "component.clientLogin.form.title": "Enter CloudFlare API Credentials", + "component.clientLogin.cloudflare.description": "New to CloudFlare? Sign up at", + "component.customcardcontrol.upgrade": "Upgrade to", "component.login.form.email": "Email", "component.login.form.forgotPassword": "Forgot your password?", "component.login.form.password": "Password", @@ -21,6 +29,9 @@ "container.activationCheckCard.title": "Activation Check", "container.activationCheckCard.status": "Status: {status}", "container.activationCheckCard.success": "Your domain is now queued up to be rescanned. Please check back in a few hours.", + "container.advanceddos.title": "Advance DDoS", + "container.advanceddos.description": "CloudFlare will stand in front of your website regardless of attack size or duration.", + "container.advanceddos.value": "Visit Cloudflare.com", "container.alwaysOnlineCard.title": "Always Onlineā„¢", "container.alwaysOnlineCard.description": "If your server goes down, CloudFlare will serve your website's static pages from our cache.", "containers.analyticsPage.cached": "Cached", @@ -33,6 +44,16 @@ "container.analyticsPage.tabs.threats": "Threats", "container.analyticsPage.title": "Analytics", "container.App.version": "Version: {version}", + "container.applydefaultsettingscard.title": "Apply Default Settings", + "container.applydefaultsettingscard.description": "We recommend you to use default settings", + "container.applydefaultsettingscard.button": "Apply", + "container.applydefaultsettingscard.success": "Your default settings have been successfully set.", + "container.applydefaultsettingscard.modal.title": "Are you sure?", + "container.applydefaultsettingscard.modal.description": "Applying default settings will overwrite some of the settings you've set through Cloudflare Dashboard.", + "container.applydefaultsettingscard.modal.buttonCancel": "Cancel", + "container.applydefaultsettingscard.modal.button": "I'm sure", + "container.appNavigation.home": "Home", + "container.appNavigation.moresettings": "More Settings", "container.appNavigation.domainsOverview": "Domains Overview", "container.appNavigation.analytics": "Analytics", "container.appNavigation.performance": "Performance", @@ -98,19 +119,38 @@ "container.dnsManagementPage.thead.changePlan": "Change", "container.ipv6Card.title": "IPv6 Compatibility", "container.ipv6Card.description": "Enable IPv6 support and gateway.", + "container.homePage.title": "Home", "container.minifyCard.title": "Auto Minify", "container.minifyCard.description": "Reduce the file size of source code on your website.", "container.minifyCard.css": "CSS", "container.minifyCard.html": "HTML", "container.minifyCard.javascript": "JavaScript", + "container.moresettings.speed": "Speed", + "container.moresettings.security": "Security", "container.performancePage.title": "Performance", + "container.pluginSpecificCacheCard.title": "Automatic Cache Management", + "container.pluginSpecificCacheCard.description": "Purge CloudFlare cache automatically on updating site appearance.", + "container.pluginSpecificCacheCard.button.enable": "Enable", + "container.pluginSpecificCacheCard.button.disable": "Disable", + "container.pluginSpecificCacheCard.modal.title": "Confirm Enabling Automatic Cache", + "container.pluginSpecificCacheCard.modal.description": "Enabling automatic cache purge will clear the entire CloudFlare cache when your site appearance is updated", + "container.pluginSpecificCacheCard.modal.button": "I'm sure", + "container.pluginSpecificCacheCard.modal.buttonCancel": "Cancel", + "container.protocolRewrite.title": "Protocol Rewriting", + "container.protocolRewrite.description": "Protocol rewriting in this context convert links within your WordPress site to images, stylesheets, and scripts from using either \"http://\" or \"https://\" to using just \"//\". This rewrite tells your browser to load all of these assets using the same protocol as the base page loaded.", + "container.purgeCacheCard.dropdown": "Purge Cache", "container.purgeCacheCard.button": "Purge Everything", "container.purgeCacheCard.title": "Purge Cache", - "container.purgeCacheCard.description": "Clear cached files to force CloudFlare to fetch a fresh version of those files from your web server.", + "container.purgeCacheCard.description": "Clear cached files to force CloudFlare to fetch a fresh version of those files from your web server. You can purge files selectively or all at once.", "container.purgeCacheCard.success": "Cache was successfully purged.", "container.purgeCacheCard.modal.title" : "Confirm Purge All", "container.purgeCacheCard.modal.description": "Note: Purging your cache may slow your website temporarily.", "container.purgeCacheCard.modal.buttonCancel": "Cancel", + "container.purgeCacheByURLCard.button": "Purge Individual Files", + "container.purgeCacheByURLCard.success": "Successfully requested 1 file(s) to be purged. Please allow up to 30 seconds for changes to take effect.", + "container.purgeCacheByURLCard.modal.title" : "Confirm Individual Files", + "container.purgeCacheByURLCard.modal.description": "You can purge up to 30 files at a time. Note: Wildcards are not supported with single file purge at this time. You will need to specify the full path to the file. Separate URL(s) with spaces, or list one per line", + "container.purgeCacheByURLCard.modal.buttonCancel": "Cancel", "container.railgunCard.title":"Railgunā„¢", "container.railgunCard.description":"Accelerate delivery of dynamic content. Note: Requires software installation at your host.", "container.railgunCard.table.name":"Name", @@ -160,5 +200,14 @@ "container.zoneProvision.modal.title": "Delete Website", "container.zoneProvision.modal.description": "Are you sure you want to delete {zoneName}? To temporarily disable CloudFlare service and save your website settings, pause your website instead.", "container.zoneProvision.modal.buttonCancel": "Cancel", + "container.ipRewrite.title": "IP Rewrite", + "container.ipRewrite.description": "Rewrite CloudFlare IP Addresses for actual end-user IP Addresses at the application layer.", + "container.imageOptimization.title": "Image Optimization", + "container.imageOptimization.description": "Improve image load time and for pages that include images on mobile devices with slow network connections", + "container.waf.title": "Web Application Firewall", + "container.waf.description": "Set rules to protect your website from web vulnerabilities.", + "constants.plans.pro": "Pro plan", + "constants.plans.biz": "Business plan", + "constants.plans.ent": "Enterprise plan", "errors.noActiveZoneSelected": "Please select a domain that is provisioned with CloudFlare." } From baed8e4cdbfa0936c25e96bf98310abe10438807 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:05:40 +0100 Subject: [PATCH 11/16] PI-721 update sync.sh --- sync.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sync.sh b/sync.sh index 15d83816..26380397 100755 --- a/sync.sh +++ b/sync.sh @@ -3,6 +3,7 @@ #$1 = username #$2 = hostname USRHOSTFLDR="$1@$2:/usr/local" +PHPVERSION="56" rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./proxy.live.php $USRHOSTFLDR/cpanel/base/frontend/paper_lantern/cloudflare/proxy.live.php rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./index.live.php $USRHOSTFLDR/cpanel/base/frontend/paper_lantern/cloudflare/index.live.php @@ -15,5 +16,5 @@ rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHos rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./lang/ $USRHOSTFLDR/cpanel/base/frontend/paper_lantern/cloudflare/lang rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./CloudFlare.pm $USRHOSTFLDR/cpanel/Cpanel/API/CloudFlare.pm rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./APIKey $USRHOSTFLDR/cpanel/bin/admin/CloudFlare/APIKey -rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./vendor/ $USRHOSTFLDR/cpanel/3rdparty/php/54/lib/php/cloudflare/vendor -rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./src/ $USRHOSTFLDR/cpanel/3rdparty/php/54/lib/php/cloudflare/src +rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./vendor/ $USRHOSTFLDR/cpanel/3rdparty/php/$PHPVERSION/lib/php/cloudflare/vendor +rsync -avz --no-owner --no-group --no-perms --copy-dirlinks -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ./src/ $USRHOSTFLDR/cpanel/3rdparty/php/$PHPVERSION/lib/php/cloudflare/src From a860e3ddba2980bac92c05fb33be8ab676ab4e11 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:14:20 +0100 Subject: [PATCH 12/16] PI-721 updated config.js to support new front-end --- config.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/config.js b/config.js index 6a7191b5..629c2c3d 100644 --- a/config.js +++ b/config.js @@ -14,6 +14,11 @@ "featureManagerIsScanEnabled": false, "featureManagerIsSecurityLevelEnabled": true, "featureManagerIsSSLEnabled": false, + "homePageCards": ["DNSManagementPage"], + "moreSettingsCards": { + "container.moresettings.security": ["SecurityLevelCard", "ChallengePassageCard", "BrowserIntegrityCheckCard"], + "container.moresettings.speed": ["AlwaysOnlineCard", "IPV6Card", "CacheLevelCard", "MinifyCard", "RailgunCard", "DevelopmentModeCard", "BrowserCacheTTLCard", "PurgeCacheCard"] + }, "locale": "en", "integrationName": "cpanel", "version": "6.0.5" From 79cfd3e5bcca22ed2dad5246d352a30efeccef98 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:20:01 +0100 Subject: [PATCH 13/16] PI-721 updated compiled.js to support DNSManagementPage --- compiled.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/compiled.js b/compiled.js index 33e9e443..6c8e9ae9 100644 --- a/compiled.js +++ b/compiled.js @@ -84071,6 +84071,10 @@ var _RailgunCard = _dereq_('../containers/RailgunCard/RailgunCard'); var _RailgunCard2 = _interopRequireDefault(_RailgunCard); +var _DNSManagementPage = _dereq_('../containers/DNSManagementPage/DNSManagementPage'); + +var _DNSManagementPage2 = _interopRequireDefault(_DNSManagementPage); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var cardMapper = { @@ -84093,12 +84097,15 @@ var cardMapper = { "SecurityLevelCard": _SecurityLevelCard2.default, "WAFCard": _WAFCard2.default, "PluginSpecificCacheCard": _PluginSpecificCacheCard2.default, - "RailgunCard": _RailgunCard2.default + "RailgunCard": _RailgunCard2.default, + "DNSManagementPage": _DNSManagementPage2.default }; +// Pages +// Cards exports.cardMapper = cardMapper; -},{"../containers/AdvanceDDoSCard/AdvanceDDoSCard":542,"../containers/AlwaysOnlineCard/AlwaysOnlineCard":543,"../containers/ApplyDefaultSettingsCard/ApplyDefaultSettingsCard":547,"../containers/BrowserCacheTTLCard/BrowserCacheTTLCard":548,"../containers/BrowserIntegrityCheckCard/BrowserIntegrityCheckCard":549,"../containers/CacheLevelCard/CacheLevelCard":550,"../containers/ChallengePassageCard/ChallengePassageCard":551,"../containers/DevelopmentModeCard/DevelopmentModeCard":555,"../containers/IPV6Card/IPV6Card":558,"../containers/ImageOptimizationCard/ImageOptimizationCard":559,"../containers/IpRewriteCard/IpRewriteCard":560,"../containers/MinifyCard/MinifyCard":563,"../containers/PluginSpecificCacheCard/PluginSpecificCacheCard":567,"../containers/ProtocolRewriteCard/ProtocolRewriteCard":568,"../containers/PurgeCacheCard/PurgeCacheCard":569,"../containers/RailgunCard/RailgunCard":570,"../containers/SSLCard/SSLCard":571,"../containers/ScanCard/ScanCard":572,"../containers/SecurityLevelCard/SecurityLevelCard":573,"../containers/WAFCard/WAFCard":577}],605:[function(_dereq_,module,exports){ +},{"../containers/AdvanceDDoSCard/AdvanceDDoSCard":542,"../containers/AlwaysOnlineCard/AlwaysOnlineCard":543,"../containers/ApplyDefaultSettingsCard/ApplyDefaultSettingsCard":547,"../containers/BrowserCacheTTLCard/BrowserCacheTTLCard":548,"../containers/BrowserIntegrityCheckCard/BrowserIntegrityCheckCard":549,"../containers/CacheLevelCard/CacheLevelCard":550,"../containers/ChallengePassageCard/ChallengePassageCard":551,"../containers/DNSManagementPage/DNSManagementPage":553,"../containers/DevelopmentModeCard/DevelopmentModeCard":555,"../containers/IPV6Card/IPV6Card":558,"../containers/ImageOptimizationCard/ImageOptimizationCard":559,"../containers/IpRewriteCard/IpRewriteCard":560,"../containers/MinifyCard/MinifyCard":563,"../containers/PluginSpecificCacheCard/PluginSpecificCacheCard":567,"../containers/ProtocolRewriteCard/ProtocolRewriteCard":568,"../containers/PurgeCacheCard/PurgeCacheCard":569,"../containers/RailgunCard/RailgunCard":570,"../containers/SSLCard/SSLCard":571,"../containers/ScanCard/ScanCard":572,"../containers/SecurityLevelCard/SecurityLevelCard":573,"../containers/WAFCard/WAFCard":577}],605:[function(_dereq_,module,exports){ 'use strict'; exports.__esModule = true; From f487b145acd9b65c2cdc9fde74faa1a3f8283938 Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Mon, 15 Aug 2016 18:27:56 +0100 Subject: [PATCH 14/16] PI-721 updated config.js to use host api login --- config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/config.js b/config.js index 629c2c3d..7fc93362 100644 --- a/config.js +++ b/config.js @@ -14,6 +14,7 @@ "featureManagerIsScanEnabled": false, "featureManagerIsSecurityLevelEnabled": true, "featureManagerIsSSLEnabled": false, + "useHostAPILogin": true, "homePageCards": ["DNSManagementPage"], "moreSettingsCards": { "container.moresettings.security": ["SecurityLevelCard", "ChallengePassageCard", "BrowserIntegrityCheckCard"], From d7ce5e42b4872a12898b94455452607f5b0ff23b Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Tue, 16 Aug 2016 14:44:35 +0100 Subject: [PATCH 15/16] PI-721 readied CSRFToken check --- proxy.live.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/proxy.live.php b/proxy.live.php index 90556d9f..ef626a0b 100644 --- a/proxy.live.php +++ b/proxy.live.php @@ -31,7 +31,14 @@ unset($body['proxyURL']); $request = new \CF\API\Request($method, $path, $parameters, $body); -$response = $requestRouter->route($request); +$isCSRFTokenValid = (($request->getMethod() === 'GET') ? true : \CF\SecurityUtil::csrfTokenValidate($cpanelAPI->getHostAPIKey(), $cpanelAPI->getUserId(), $request->getBody()['cfCSRFToken'])); +unset($body['cfCSRFToken']); + +if ($isCSRFTokenValid) { + $response = $requestRouter->route($request); +} else { + $response = $apiRouter->getAPIClient()->createAPIError('CSRF Token not valid.'); +} echo json_encode($response); From b68f8470426819a47180200a8f9c2edbf7a563bf Mon Sep 17 00:00:00 2001 From: Furkan Yilmaz Date: Wed, 17 Aug 2016 11:03:36 +0100 Subject: [PATCH 16/16] PI-721 fixed CSRF Token error message --- proxy.live.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/proxy.live.php b/proxy.live.php index ef626a0b..1d61c4ff 100644 --- a/proxy.live.php +++ b/proxy.live.php @@ -37,7 +37,18 @@ if ($isCSRFTokenValid) { $response = $requestRouter->route($request); } else { - $response = $apiRouter->getAPIClient()->createAPIError('CSRF Token not valid.'); + $message = 'CSRF Token not valid.'; + $response = array( + 'result' => null, + 'success' => false, + 'errors' => array( + array( + 'code' => '', + 'message' => $message, + ), + ), + 'messages' => array(), + ); } echo json_encode($response);